[python-win32] win32file.CreateFile versus win32file.CreateFileW
Mark Hammond
mhammond at skippinet.com.au
Tue Feb 7 23:36:39 CET 2012
Re-added python-win32 - please follow-up there.
On 8/02/2012 1:06 AM, Scott Leerssen wrote:
> Thanks Mark. You wouldn't happen to know the encoding of the 8.3
> filename, would you? I'm having a heck of a time setting that value
> with Japanese characters in it. win32file.SetFileShortName purports
> to take a PyUNICODE, but I get invalid parameter exceptions with
> unicode Japanese strings.
win32file.SetFileShortName always calls SetFileShortNameW - thus,
passing a Unicode object avoids any encoding at all.
I can't find much in the way of references, but it seems that shortnames
are restricted to bytes and I'd expect Japanese characters to be
multi-byte - so may simply be invalid. Have you tried an ascii name?
If that also fails, then the API docs for that function list some
additional restrictions you might need to follow.
Cheers,
Mark
>
> Thanks, Scott
>
> On Feb 6, 2012, at 5:40 PM, Mark Hammond wrote:
>
>> On 7/02/2012 2:45 AM, Scott Leerssen wrote:
>>> I'm trying to open files with names that contain Japanese
>>> characters, and found that win32file.CreateFile would raise an
>>> exception indicating that 'The filename, directory name, or
>>> volume label syntax is incorrect'. I found win32file.CreateFileW
>>> (documented to deal with 'unicode'), and that did return a handle
>>> for me. What puzzles me is that both functions take a PyUNICODE
>>> filename, so I just assumed that CreateFile would deal with the
>>> unicode pathname I was giving it. So, my question is, should I
>>> just use win32file.CreateFileW instead of win32file.CreateFile,
>>> and is it safe to use for all file handles, including those that
>>> do not have wide characters?
>>
>> The short story is that CreateFile will take unicode strings and
>> use the "mbcs" codec to convert them to the bytes required by
>> CreateFile. Sadly that codec doesn't throw an error on characters
>> that can't be converted (ie, characters outside the current
>> code-page) - you just get a string with "?" chars in it. You could
>> try manually doing 'filename.encode("mbcs")' and see if you get
>> such chars. CreateFileW should be safe for any filename (although
>> if you pass a str object to it, it will attempt to decode using
>> mbcs - ie, the str must already be in mbcs format). As mbcs==ascii
>> for all ascii chars, you never see the problem on filenames with
>> only ascii chars.
>>
>> Mark
>>
>>>
>>> Thanks, Scott _______________________________________________
>>> python-win32 mailing list python-win32 at python.org
>>> http://mail.python.org/mailman/listinfo/python-win32
>>
>
More information about the python-win32
mailing list