Windows uses case-insensitive file names, so I can open the same file with any of these:
r"c:\windows\system32\desktop.ini"
r"C:\WINdows\System32\DESKTOP.ini"
r"C:\WiNdOwS\SyStEm32\DeSkToP.iNi"
etc. Given any of these paths, how can I find the true case? I want them all to produce:
r"C:\Windows\System32\desktop.ini"
os.path.normcase
doesn't do it, it simply lowercases everything. os.path.abspath
returns an absolute path, but each of these is already absolute, and so it doesn't change any of them. os.path.realpath
is only used to resolve symbolic links, which Windows doesn't have, so it's the same as abspath on Windows.
Is there a straightforward way to do this?
Ned's GetLongPathName
answer doesn't quite work (at least not for me). You need to call GetLongPathName
on the return value of GetShortPathname
. Using pywin32 for brevity (a ctypes solution would look similar to Ned's):
>>> win32api.GetLongPathName(win32api.GetShortPathName('stopservices.vbs'))
'StopServices.vbs'