Swift:快速获取文件夹的大小

问题描述 投票:0回答:1

这里有很多关于在 Swift 中以编程方式获取文件夹大小的主题。所有接受的答案都建议使用 FileManager,然后枚举所有文件并计算所有文件的大小。

但是,我在问自己是否有更快的方法来获取文件夹的大小?枚举所有文件可能需要很长时间,当我使用 Finder 并右键单击文件夹并选择“信息”时,大小会立即显示。

大小是仅对操作系统可用的文件夹的“秘密”属性吗?操作系统是否在后台索引所有文件夹/文件?

当我在 Windows 中做同样的事情时,子文件夹和文件也被枚举。

我为什么要问这个问题?因为我正在开发一个处理目录文件的应用程序,所以我想显示某种进度条。但是如果我必须枚举所有文件两次(一次是为了获得总数,一次是为了实际处理它们),就不是很好了。

问候, 萨沙

swift macos file indexing filesize
1个回答
0
投票

但是,我在问自己是否有更快的方法来获取文件夹的大小?

答案可能取决于使用的文件系统。与大多数操作系统一样,macOS 支持多种不同的文件系统,确定目录大小的最佳方法可能对所有文件系统都不相同。因此,我将考虑 Apple 的文件系统 APFS 来回答剩余的问题。

枚举所有文件可能需要很长时间,当我使用 Finder 并右键单击文件夹并选择“信息”时,大小会立即显示。

只是因为信息 似乎 立即显示并不意味着 Finder 没有计算目录中文件大小的总和。实际上,如果您在一个已知有很多文件的目录(例如

/System
)上尝试使用“获取信息”命令,您会发现 Finder 需要相当长的时间来确定文件夹的大小:

大小是仅对操作系统可用的文件夹的“秘密”属性吗?操作系统是否在后台索引所有文件夹/文件?

它当然不是似乎。再次尝试查看一个目录,该目录包含各种子目录中的数千个文件。

此外,尝试使用

du
命令来确定大目录的磁盘使用情况,例如
du -d0 somedirectory
;对于包含数十个文件的目录,它几乎立即响应,但对于大目录可能需要几秒钟。

当我在 Windows 中做同样的事情时,子文件夹和文件也被枚举。

考虑一下,如果文件系统要不断跟踪所有目录的大小,写入任何文件都可能改变文件的大小,以及文件路径中的每个目录。由于询问目录大小的次数比写入文件(或移动或删除文件)的次数要少得多,因此文件系统会做很多工作却收效甚微。

还要考虑询问目录大小的方法不止一种。您可能想知道目录中的文件使用了多少空间,但不包括子目录。您可能想了解逻辑文件大小(文件中的字节数)或物理大小(用于存储这些字节的块数)。您可能希望在计算中包含符号链接,也可能不包含。准备只回答问题的一个版本可能并没有多大帮助,准备回答问题的每个版本将需要大量工作。

考虑到所有这些,当通过递归枚举目录中的所有文件和子目录询问时,macOS 和 Windows 计算目录大小也就不足为奇了。

如果您想要一个关于您正在使用的文件系统的绝对权威答案,请查看该系统的已发布信息。例如,这里是 Apple 文件系统 (ApFS)(PDF) 的数据。快速查看后,我没有在相关结构中看到目录累积大小的字段。


请注意,如果您在 MacOS 中选择整个卷并使用“获取信息”命令,您do几乎会立即看到已使用的空间量。我相信这是因为文件系统必须跟踪卷的总大小和可用空间,以便能够在需要时提供可用块。因此,确定使用的空间量非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.