Eryk Sun <eryk...@gmail.com> added the comment: Yes, it makes sense to call GetFileAttributes as the fast path, and then fall back on a slow path (i.e. create, query, close) for a directory reparse point. With GetFileInformationByHandleEx, the equivalent query is FileBasicInfo, which is available starting with Vista, so this could be backported to 3.5 if necessary.
However, to be more consistent with POSIX, we need to first query FileAttributeTagInfo on the reparse point to get the reparse tag. If it's IO_REPARSE_TAG_MOUNT_POINT (junction) and the target is a volume name (i.e. "Volume{GUID}"), then we should return true. This can also be checked via GetVolumePathName, after normalizing the path, like how os.path.ismount() works on Windows (ntpath.py). A mount point is always a directory, even if the volume isn't currently available. OTOH, sometimes junctions are used as links instead, which is being addressed more generally by Vidar Fauske in issue 31226. There's potentially overlap here with Vidar's proposed _Py_is_reparse_link function. More info on GetFileAttributes, if you're curious: GetFileAttributes and GetFileAttributesEx are relatively cheap I/O calls. They're implemented by translating to a native NT path and calling NtQueryAttributesFile and NtQueryFullAttributesFile, respectively. These two system calls are optimized for network access. They use an open packet that that's query-only without reparsing. The I/O Manager's parse routine can thus use a local (fake) File object, the file system's corresponding fast I/O routine, and skip the normal cruft of working with an I/O request (i.e. IRP_MJ_CREATE, IRP_MJ_QUERY_INFORMATION, IRP_MJ_CLEANUP, and IRP_MJ_CLOSE). In the sample fastfat driver, these routines are respectively FatFastQueryBasicInfo [1] and FatFastQueryNetworkOpenInfo [2]. [1]: https://github.com/Microsoft/Windows-driver-samples/blob/aa6e0b36eb932099fa4eb950a6f5e289a23b6d6e/filesys/fastfat/fatdata.c#L933 [2]: https://github.com/Microsoft/Windows-driver-samples/blob/aa6e0b36eb932099fa4eb950a6f5e289a23b6d6e/filesys/fastfat/fatdata.c#L1272 ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue33010> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com