Fun stuff with \?
This comes up in an internal discussion about MAX_PATH limit. People do mention that the core file services supports syntax like [\\?\](file://\\?\) for path longer than MAX_PATH. The caveat is that file name with [\\?\](file://\\?\) is not canonicalized by the OS. This can lead to many funny behavior. One of our senior developer writes the following example to illustrate this problem.
C:\temp>md "\\?\c:\temp\bar."
C:\Temp>dir *bar*
Volume in drive C has no label.
Volume Serial Number is B0F1-CCDC
Directory of C:\Temp
02/18/2004 04:06 AM <DIR> bar.
0 File(s) 0 bytes
1 Dir(s) 6,810,882,048 bytes free
C:\Temp>rd bar.
The system cannot find the file specified.
c:\Temp\md bar
C:\Temp>dir *bar*
Volume in drive C has no label.
Volume Serial Number is B0F1-CCDC
Directory of C:\Temp
02/18/2004 04:08 AM <DIR> bar
02/18/2004 04:06 AM <DIR> bar.
0 File(s) 0 bytes
2 Dir(s) 6,810,882,048 bytes free
C:\Temp>echo foo > bar.\12346.txt
C:\Temp>dir/s/b 12346.txt
C:\Temp\bar\12346.txt
C:\Temp\bar.\12346.txt
C:\Temp>del /s 12346.txt
Deleted file - C:\Temp\bar\12346.txt
C:\Temp>echo foo > "\\?\c:\Temp\bar.\12347.txt"
C:\Temp>dir/s/b 12347.txt
File Not Found
C:\Temp>type "\\?\c:\Temp\bar.\12347.txt"
foo
Comments
- Anonymous
February 18, 2004
I don't know if this should be considered a bug or not, really, but can't change to a directory created this way using cmd.exe - it believes, thanks to the , that it's a UNC path, and so can't be the CWD.
Probably a good thing, really, but an interesting side-effect nonetheless. - Anonymous
February 18, 2004
yes because side effects are good in software. - Anonymous
February 18, 2004
As a general rule, no.
However, given that cmd.exe obviously doesn't have a clue how to handle such paths, it's probably a good thing that it has as little to do with them as possible. - Anonymous
February 20, 2004
This has nothing to do with UNC paths. ? prefix allows you to bypass win32 naming rules (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/naming_a_file.asp).
This is how you can create names such as "bar." (which is not a valid win32 directory name).