On 10/08/2019 11:50:35, eryk sun wrote:
I'm also curious why the string needs to *end* with a backslash. Both of these are the same path:
C:\foo\bar\baz\ C:\foo\bar\baz Also, the former is simply more *informative* - it tells the reader that baz is expected to be a directory, not a file. Rob Cliffe The above two cases are equivalent. But that's not the case for the root directory. Unlike Unix, filesystem namespaces are implemented
On 8/9/19, Steven D'Aprano <steve@pearwood.info> wrote: directly on devices. For example, "//./C:" might resolve to a volume device such as "\\Device\\HarddiskVolume2". With a trailing slash added, "//./C:/" resolves to "\\Device\\HarddiskVolume2\\", which is the root directory of the mounted filesystem on the volume.
Also, as a classic DOS path, "C:" without a trailing slash expands to the working directory on drive "C:". The system runtime library looks for this path in a hidden environment variable named "=C:". The Windows API never sets these hidden "=X:" drive variables. The C runtime sets them, as does Python's os.chdir.
Some volume-management functions require a trailing slash or backslash, such as GetVolumeInformationW [1]. GetVolumeNameForVolumeMountPointW [2] actually requires it to be a trailing backslash. It will not accept a trailing forward slash such as "C:\\Mount\\Volume/" (a bug since Windows 2000). The volume name (e.g. "\\\\?\\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\\") returned by the latter includes a trailing backslash, which must be present in the target path in order for a mountpoint to function properly as a directory, else it would resolve to the volume device instead of the root directory.
[1] https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvol... [2] https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvol...
If they're Windows developers, they ought to be aware that the Windows file system API allows / anywhere you can use \ and it is the common convention in Python to use forward slashes. The Windows file API actually does not allow slash to be used anywhere that we can use backslash. It's usually allowed, but not always. For the most part, the conditions where forward slash is not supported are intentional.
Windows replaces forward slash with backslash in normal DOS paths and normal device paths. But sometimes we have to use a special form of device path that bypasses normalization. A path that isn't normalized can only use backslash as the path separator. For example, the most common case is that the process doesn't have long paths enabled. In this case we're limited to MAX_PATH, which limits file paths to a paltry 259 characters (sans the terminating null); the current directory to 258 characters (sans a trailing backslash and null); and the path of a new directory to 247 characters (subtract 12 from 259 to leave space for an 8.3 filename). By skipping DOS normalization, we can access a path with up to about 32,750 characters (i.e. 32,767 sans the length of the device name in the final NT path under "\\Device\\").
(Long normalized paths are available starting in Windows 10, but the system policy that allows this is disabled by default, and even if enabled, each application has to declare itself to be long-path aware in its manifest. This is declared for python[w].exe in Python 3.6+.)
A device path is an explicit reference to a user's local device directory (in the object namespace), which shadows the global device directory. In NT, this directory is aliased to a special "\\??\\" prefix (backslash only). A local device directory is created for each logon session (not terminal session) by the security system that runs in terminal session 0 (i.e. the system services session). The per-logon directory is located at "\\Sessions\\0\\DosDevices\\<Logon Session ID>". In the Windows API, it's accessible as "//?/" or "//./", or with any mix of forward slashes or backslashes, but only the all-backslash form is special-cased to bypass the normalization step. _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-leave@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/3SDFM2EK...
--- This email has been checked for viruses by AVG. https://www.avg.com