Windows内核中可能的最大文件名长度

Meh*_*dad 5 winapi filenames kernel path name-length

我想知道,Windows内核允许的最长名称长度是多少?

例如:我知道内核使用UNICODE_STRING结构来保存所有对象路径,并且因为宽字符串的字节长度存储在a中USHORT,所以允许最大路径长度为2 ^ 15-1个字符.是否对文件名(而不是路径)有类似的严格限制?(我不在乎NTFS或FAT32是否有特殊的限制;我正在寻找内核中理论上允许的最长名称,假设没有额外的文件系统或shell限制.)

(编辑:对于那些想知道为什么这甚至很重要的人,考虑一下,通常,遍历目录是通过FindFirstFile/ FindNextFile调用实现的,每个文件调用一次.给定名为function的函数NtQueryDirectoryFile,它是底层系统调用,每次调用返回多个文件名,它是实际上可以利用路径上的这个最大长度限制来创建一个非常快速的目录遍历器,它只使用堆栈作为缓冲区.现在我正在尝试扩展这个概念,我需要知道最大的大小文件名.)

Hel*_*ein 5

路径的最大长度为32,767个字符,其中每个路径组件(目录或文件)的最大长度可以为255个字符(更准确地说,是GetVolumeInformation函数的lpMaximumComponentLength参数中返回的值).

在MSDN上记录.


Meh*_*dad 2

啊,我自己发现这个页面保证文件名不能超过255个字符:

  • 路径名的长度不得超过 32,760 个字符。
    ...
  • 每个路径名组成部分的长度不得超过 255 个字符。

这让我想知道:

为什么 Windows使用ULONGs 表示文件长度,而使用USHORTs 表示路径长度?!

如果有人知道这是为什么,请留言/评论!我比较好奇。:)

  • ULONG 可能用于保持与目录信息头记录中其他字段的对齐。UNICODE_STRING 的 USHORT 限制才是真正的限制。在信息标头中使用 USHORT 要么需要填充值,要么使结构的其余部分不对齐。请注意,每个头记录需要按 8 个字节对齐。 (2认同)