[Python-Dev] Special file "nul" in Windows and os.stat

Scott Dial scott+python-dev at scottdial.com
Wed Nov 7 08:09:23 CET 2007


Martin v. Löwis wrote:
>> In order to keep the higher accuracy timestamps for normal files and to
>> maintain the old behavior, my recommendation would be that the existing
>> implementation of win32_stat/win32_wstat be extended to use
>> FindFileFirst if GetFileAttributes* fails. I would be willing to do the
>> legwork for such a patch if everyone agrees this is the appropriate
>> solution.
> 
> That, in general, might be wrong. os.stat("*.txt") should fail, even
> though FindFirstFile will succeed when passed that string.
> 

Sorry, I meant to imply that we would guard FindFirstFile in the same 
manner that _stati64 and friends do already (using strpbrk/wcspbrk to 
search for "?*" in the path). At that point, you have essentially 
duplicated the CRT code with the added improvement of using 
GetFileAttributes* to retrieve the high-precision timestamps. So, I 
think my opinion has changed now to say: first, use GetFileAttributes*, 
and if that fails use _stati64/_wstati64.

> That was my primary motivation for not using FindFirstFile by default:
> it may succeed even if the string being passed does not denote a file
> name.

While I understand your reasoning, I thought we were letting the 
platform decide what are and are not files. This bug appeared because we 
are imposing our own notion of what a file is or is not, probably only 
by ignorance of the differences of GetFileAttribute* and FindFirstFile. 
So, my suggestion is basically a compromise of keeping higher precision 
timestamps for paths where GetFileAttribute* works and retaining the old 
behavior for all others.

> 
>> * As an aside, Martin, I find the argument that "hard-wiring is bad" to
>> be against what is actually occurring in the posixmodule. For that
>> matter, the S_IFEXEC flag is hardwired to path in (*.bat, *.cmd, *.exe,
>> *.com) despite the fact that the platform says it is really anything in
>> the list of os.getenv('PATHEXT'), but I suppose that is a bug for
>> another day.
> 
> No. See the source of the C library - the algorithm Python uses now is
> (or should be) the same as the one of the C library. Of course, you
> may argue that then msvcrt has the same bug.
> 

I concede and apologies, I didn't read the code for converting 
attributes to mode flags. I don't imagine (m)any people care about this 
flag on the win32 platform anyways.

-Scott

-- 
Scott Dial
scott at scottdial.com
scodial at cs.indiana.edu


More information about the Python-Dev mailing list