Mailing List Archive

win32api -- long vs short filenames
I'm trying to expand a mangled DOS 8+3 name (from WinNT4.0) into the long
version of the name. There's a win32api function for doing the opposite, for
example,

>>> win32api.GetShortPathName(r'c:\long_path_name\long_file_name.txt')
'c:\\LONG_P~1\\LONG_F~1.TXT'

But I can't figure out how to expand a mangled name into the original long
name. Any ideas?

--David Niergarth
win32api -- long vs short filenames [ In reply to ]
On Wed, 4 Aug 1999, David Niergarth wrote:

> I'm trying to expand a mangled DOS 8+3 name (from WinNT4.0) into the long
> version of the name. There's a win32api function for doing the opposite, for
> example,
>
> >>> win32api.GetShortPathName(r'c:\long_path_name\long_file_name.txt')
> 'c:\\LONG_P~1\\LONG_F~1.TXT'
>
> But I can't figure out how to expand a mangled name into the original long
> name. Any ideas?

>>> win32api.FindFiles(r'c:\PROGRA~1')[0][-2]
'Program Files'

See doc in the .hlp file.

--david
win32api -- long vs short filenames [ In reply to ]
David Niergarth <jdnier@execpc.com> wrote in message
news:7oa0n0$72n@newsops.execpc.com...
> I'm trying to expand a mangled DOS 8+3 name (from WinNT4.0) into the long
> version of the name. There's a win32api function for doing the opposite,
for
> example,
>
> >>> win32api.GetShortPathName(r'c:\long_path_name\long_file_name.txt')
> 'c:\\LONG_P~1\\LONG_F~1.TXT'
>
> But I can't figure out how to expand a mangled name into the original long
> name. Any ideas?
>
> --David Niergarth

David Asher (thanks, by the way) pointed me to win32api.FindFiles(), as in

>>> win32api.FindFiles(r'c:\PROGRA~1')[0][-2]
'Program Files'

This returns the long version of the last component of the path that you
feed it but not the long version of the entire path, which is what I'm
after. In case anybody is interested, here's a function that will return the
long version of the entire path from either a mangled absolute path or a
mangled simple file name in Python's current directory.

def win32_GetLongPathName(pathname):
"""Transform a mangled 8+3 pathname to original long name.

pathname -- Can be an absolute path or a simple file or direcotry name
if it exists in Python's notion of the current directory.

If a simple file or directory name cannot be resolved or an absolute
path cannot be found, the original pathname will be silently returned.

"""
import os, win32api
if os.path.isabs(pathname):
abspath = pathname
else:
cur_dir = os.getcwd()
newpath = os.path.join(cur_dir, pathname)
if os.path.isfile(newpath):
abspath = newpath
else:
return pathname # could not resolve relative path
pieces = []
head, tail = os.path.split(abspath)
while tail:
try:
longtail = win32api.FindFiles(os.path.join(head, tail))[0][-2]
except IndexError:
return pathname # could not find path
pieces.insert(0, longtail)
head, tail = os.path.split(head)
pieces.insert(0, head)
return apply(os.path.join, pieces)

Seems like there should be an easier way, but this works for me.

--David Niergarth