文件名的长度如何影响磁盘上剩余的存储空间?

6
文件名的长度会影响磁盘上剩余的存储空间吗?
我知道这与文件系统有关,尤其是我想到的是EXT系列文件系统。我不完全理解索引节点如何影响磁盘空间以及文件名本身如何存储。这个问题很难得到相关的搜索结果。因此我在这里提问。在Linux中,最大文件名长度通常为255或256个字符。创建文件系统时,每个文件名是否“保留”了相应的空间呢?换句话说,实际文件名是否不会影响磁盘存储,因为已经使用了最大值?还是比这更复杂?
假设我有一个名为“joe.txt”的文件,并将其重命名为“joe2.txt”。这之后,可用磁盘空间的数量是否减少了?那么像“joe_version.txt”或“joe_original_version_with_bug_that_Jim_solved.txt”这样较长的名称呢?我担心8、16、32、64等字符的阈值。我将存储数百万个图像。我以前从未担心过这样的问题,所以我不完全确定它是如何工作的。
虽然我只使用EXT文件系统,但讨论FAT和其他文件系统可能对其他类似问题的人也有用。
2个回答

5
在Linux(或更一般地说,Unix类型的文件系统)中,文件名存储在目录条目inode中,该inode包含每个目录中每个文件的(文件名,inode号)映射列表。我的理解是,对于每个文件名,都有NAME_MAX个字符的保留空间。在Linux上,确实NAME_MAX为255。
因此,回答你的问题,当文件系统创建时,并没有为文件名预留空间,但一旦创建文件,就会为名称保留NAME_MAX字节。此外,对于目录inode,我的理解是,在ext2/3/4上至少分配了磁盘块(4 KB,除非你正在做一些非常奇怪的事情),以所需的方式进行。也就是说,一个目录最少占用4 KB(加上父目录inode中的一个条目),如果(文件名,inode)对的列表不适合这4 KB(减去其他开销,例如目录权限),它将分配一个新的4 KB块来继续该列表,以此类推(ext2/3使用间接块方案,而ext4则使用范围)。

我希望更多的人最终会评论你的答案并确认它。我认为它是正确的,但我仍然不知道100%。 - SO Stinks
请注意,程序不应盲目地假设系统范围内的NAME_MAX实际上可以使用。许多文件系统确实支持那么多字节,这可能与经常使用的UTF-8编码的字符完全不同。此外,如果当前挂载的是例如ecryptfs,则实际限制可能更接近160个字节。要获取真正的限制,请运行getconf NAME_MAX /path/to/directory - Mikko Rantalainen
关于原问题的答案:文件名的存储取决于文件系统,有些文件系统可能不会为每个文件名保留255个字节,而是将目录条目压缩以尽可能多地适合一个磁盘块。此外,由于历史原因,大多数文件系统仍然设计为512字节的磁盘块,因此如果更改适合现有块,则不需要空间。如果更改不适合,则会保留额外的块,直到数据适合为止。 - Mikko Rantalainen

1

FAT16 预分配。

FAT32 使用一种解决方法来提供长文件名;随着文件名变得越来越长,需要额外的目录文件块来存储额外的字符 - 而目录文件是一个常规文件,因此这会消耗额外的磁盘空间。然而,最小的分配是一个簇,因此除非额外的文件名存储超过了簇边界,否则不会从您本来可以使用的磁盘空间中消耗额外的磁盘空间。

我不熟悉类 UNIX 文件系统如何处理文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接