ine*_*tus 6 indexing macos file filesize swift
这里有很多关于在 Swift 中以编程方式获取文件夹大小的主题。所有接受的答案都建议使用 FileManager,然后枚举所有文件并对所有文件的大小求和。
但是,我在问自己是否有更快的方法来获取文件夹的大小?枚举所有文件可能需要很长时间,当我使用 Finder 并右键单击文件夹并选择“信息”时,大小会立即显示。
大小是仅操作系统可用的文件夹的“秘密”属性吗?操作系统是否在后台索引所有文件夹/文件?
当我在 Windows 中执行相同的操作时,子文件夹和文件也会被枚举。
我为什么要问这个问题?因为我正在开发一个正在处理目录文件的应用程序,我想显示某种进度条。但是,如果我必须枚举所有文件两次(一次是为了获取总数,一次是为了实际处理它们),那就不太好了。
问候,萨沙
但是,我在问自己是否有更快的方法来获取文件夹的大小?
答案可能取决于所使用的文件系统。与大多数操作系统一样,macOS 支持多种不同的文件系统,并且确定目录大小的最佳方法对于所有文件系统可能并不相同。因此,我将根据 Apple 的文件系统 APFS 来回答其余问题。
枚举所有文件可能需要很长时间,当我使用 Finder 并右键单击文件夹并选择“信息”时,大小会立即显示。
仅仅因为信息似乎立即显示,并不意味着 Finder 不会计算目录中文件大小的总和。事实上,如果您在已知有大量文件的目录(例如 )上尝试“获取信息”命令,/System您会发现 Finder 需要相当长的时间来确定文件夹的大小:
大小是仅操作系统可用的文件夹的“秘密”属性吗?操作系统是否在后台索引所有文件夹/文件?
看来确实不是。再次尝试查看一个目录,该目录的各个子目录中包含数千个文件。
另外,尝试使用du命令来确定大目录的磁盘使用情况,例如du -d0 somedirectory;对于包含数十个文件的目录,它几乎立即响应,但对于大型目录可能需要数秒的时间。
当我在 Windows 中执行相同的操作时,子文件夹和文件也会被枚举。
考虑一下,如果文件系统要不断跟踪所有目录的大小,则写入任何文件都可能会更改文件的大小以及文件路径中的每个目录的大小。由于询问目录大小的频率比写入文件(或移动或删除文件)的频率要低得多,因此文件系统会做大量工作而几乎没有什么好处。
还要考虑一下,询问目录大小的方法不止一种。您可能想知道目录中的文件使用了多少空间,但不包括子目录。您可能想了解逻辑文件大小(文件中的字节数)或物理大小(用于存储这些字节的块数)。您可能想要在计算中包含符号链接,也可能不包含。准备只回答问题的一个版本可能并没有多大帮助,而准备回答问题的每个版本则需要大量的工作。
考虑到所有这些,macOS 和 Windows 在被要求时通过递归枚举目录中的所有文件和子目录来计算目录大小就不足为奇了。
如果您想要您正在使用的文件系统的绝对权威答案,请查看该系统的已发布信息。例如,以下是 Apple 文件系统 (ApFS) (PDF) 的数据。快速查看后,我没有在相关结构中看到目录累积大小的字段。
请注意,如果您在 MacOS 中选择整个卷并使用“获取信息”命令,您几乎会立即看到已使用的空间量。我相信这是因为文件系统必须跟踪卷的总大小和可用空间,以便能够根据需要提供可用块。因此,确定所使用的空间量非常简单。