Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Windows/win32all, unicode and long filenames

Reply
Thread Tools

Windows/win32all, unicode and long filenames

 
 
Neil Hodgson
Guest
Posts: n/a
 
      08-27-2005
Kevin Ollivier:

> On Windows, it's very common to have a string of long directories in the
> pathname for files, like "C:\Documents and Settings\My Long User Name\My
> Documents\My Long Subdirectory Name\...". For a wxPython application I'm
> working on, this has actually caused me to run into what appears to be
> Python's pathname length limit for opening files. (247 chars on Win) Yes,
> I can hear people saying "yipes!" but this stuff does happen sometimes on
> Windows.


The Win32 API restricts path arguments to 260 characters. Longer
paths can be passed to wide character functions by using a "\\?" prefix.
http://msdn.microsoft.com/library/de...ing_a_file.asp
This may work from Python although I haven't tested it.

> My first inclination was to use win32api.GetShortPathName(mypath),
> ...
> Looking at the pyWin32 sources, it does look like only the ASCII version
> of this function exists, which suggests that for now this route is a
> dead-end.


All APIs can be accessed through ctypes.

Neil
 
Reply With Quote
 
 
 
 
Kevin Ollivier
Guest
Posts: n/a
 
      08-28-2005
Hi all,

On Windows, it's very common to have a string of long directories in the
pathname for files, like "C:\Documents and Settings\My Long User Name\My
Documents\My Long Subdirectory Name\...". For a wxPython application I'm
working on, this has actually caused me to run into what appears to be
Python's pathname length limit for opening files. (247 chars on Win) Yes,
I can hear people saying "yipes!" but this stuff does happen sometimes on
Windows.

My first inclination was to use win32api.GetShortPathName(mypath), which
worked fine until I had an unicode pathname with non-ascii characters in
it. Those give me the 'oridnal not in
range' errors performing an ascii encode, meaning that GetShortPathName
doesn't handle unicode objects. The problem is that I'm working with
Unicode filenames that contain characters that are not only non-ascii
characters, but characters not in the current locale's character set as
well. So I can't just 'down convert' from a unicode object to a string
object in the current character set without corrupting the filename.
Looking at the pyWin32 sources, it does look like only the ASCII version
of this function exists, which suggests that for now this route is a
dead-end.

The only other solution I could think of is to call
os.chdir(long_pathname) and open the file using a filename relative to
long_pathname instead of an absolute path. But I was wondering if there
was another solution, preferably one that doesn't require me to muck with
the current directory, and I was also wondering if there was a simple way
to get one or both of the above limitations removed.

Thanks in advance for any help,

Kevin
 
Reply With Quote
 
 
 
 
Kevin Ollivier
Guest
Posts: n/a
 
      08-28-2005
On Sat, 27 Aug 2005 23:30:46 +0000, Neil Hodgson wrote:

> Kevin Ollivier:
>
>> On Windows, it's very common to have a string of long directories in the
>> pathname for files, like "C:\Documents and Settings\My Long User Name\My
>> Documents\My Long Subdirectory Name\...". For a wxPython application I'm
>> working on, this has actually caused me to run into what appears to be
>> Python's pathname length limit for opening files. (247 chars on Win) Yes,
>> I can hear people saying "yipes!" but this stuff does happen sometimes on
>> Windows.

>
> The Win32 API restricts path arguments to 260 characters. Longer
> paths can be passed to wide character functions by using a "\\?" prefix.
> http://msdn.microsoft.com/library/de...ing_a_file.asp
> This may work from Python although I haven't tested it.
>
>> My first inclination was to use win32api.GetShortPathName(mypath),
>> ...
>> Looking at the pyWin32 sources, it does look like only the ASCII version
>> of this function exists, which suggests that for now this route is a
>> dead-end.

>
> All APIs can be accessed through ctypes.


Thanks for the tips! I had heard of ctypes but it never crossed my mind it
was for accessing functions from shared libraries. I'll try both of
your tips out, and one of them should resolve the problem.

Kevin

> Neil


 
Reply With Quote
 
Do Re Mi chel La Si Do
Guest
Posts: n/a
 
      08-28-2005
Hi !


You are true.
But, more, don't believe : for use with CD-Rom/DVD, a path cannot to have
more than 64 caracteres.


@-salutations

Michel Claveau


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Having compilation error: no match for call to (const __gnu_cxx::hash<long long int>) (const long long int&) veryhotsausage C++ 1 07-04-2008 05:41 PM
Use of Long and Long Long Bart C C Programming 27 01-15-2008 05:27 AM
long long and long Mathieu Dutour C Programming 4 07-24-2007 11:15 AM
os.path.exists and unicode filenames Peter Bienstman Python 1 11-07-2006 07:32 PM
problem with filenames, Filenames and FILENAMES B.J. HTML 4 04-23-2005 08:13 PM



Advertisments