Eryk Sun added the comment:

> There is no similar function taking a directory handle

In 3.5+ the CRT has O_OBTAIN_DIR (0x2000) for opening a directory, i.e. to call 
CreateFile with backup semantics. A directory can be read via 
GetFileInformationByHandleEx [1] using the information classes 
FileIdBothDirectoryRestartInfo and FileIdBothDirectoryInfo. This info class is 
just a simplified wrapper around the more powerful system call 
NtQueryDirectoryFile [2]. 

The implementation details could be hidden behind _Py_opendir, _Py_fdopendir, 
_Py_readdir, and _Py_closedir -- allowing a common implementation of the 
high-level listdir() and scandir() functions. I wrote a ctypes prototype of 
listdir() along these lines.

One feature that's lost in using GetFileInformationByHandleEx to list a 
directory is the ability to do wildcard filtering. However, Python listdir and 
scandir never uses wildcard filtering, so it's no real loss. FindFirstFile 
implements this feature via the FileName parameter of NtQueryDirectoryFile. 
First it translates DOS wildcards to NT's set of 5 wildcards. There's the 
native NT '*' and '?', plus the quirky semantics of MS-DOS via '<', '>', and 
'"', i.e. DOS_STAR, DOS_QM, and DOS_DOT. See FsRtlIsNameInExpression [3] for a 
description of these wildcard characters. 

[1]: https://msdn.microsoft.com/en-us/library/aa364953
[2]: https://msdn.microsoft.com/en-us/library/ff567047
[3]: https://msdn.microsoft.com/en-us/library/ff546850

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue25996>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to