I was wondering, what is the longest possible name length allowed by the Windows kernel?
E.g.: I know the kernel uses UNICODE_STRING
structures to hold all object paths, and since the byte length of a wide-character string is stored inside a USHORT
, that allows for a maximum path length of 2^15 - 1 characters. Is there a similar, hard restriction on a file name (rather than path)? (I don't care if NTFS or FAT32 imposes a particular restriction; I'm looking for the longest possible theoretically allowed name in the kernel, assuming no additional file system or shell restrictions.)
(Edit: For those wondering why this even matters, consider that normally, traversing a directory is achieved by FindFirstFile
/FindNextFile
calls, one call per file. Given the function named NtQueryDirectoryFile
, which is the underlying system call and which returns multiple file names per call, it's actually possible to take advantage of this maximum-length restriction on the path to make an extremely-fast directory traverser that uses solely the stack as a buffer. Now I'm trying to extend that concept, and I need to know the maximum size of a file name.)
The maximum length of a path is 32,767 characters whereby each path component (directory or file) can have a maximum length of 255 characters (to be more exact, the value returned in the lpMaximumComponentLength parameter of the GetVolumeInformation function).
This is documented on MSDN.
Ah, I found this page myself that guarantees that file names can't be longer than 255 characters:
Which makes me wonder:
Why does Windows use
ULONG
s for file name lengths, when it usesUSHORT
s for path lengths?!If anyone knows why this is, please post/comment! I'm rather curious. :)