gpt4 book ai didi

ios - 如何计算文件夹的大小?

转载 作者:行者123 更新时间:2023-11-30 13:14:49 25 4
gpt4 key购买 nike

我正在使用 iPhone 应用程序创建一个文件夹来缓存文档中的图像。我希望能够将此文件夹的大小保持在 1MB,因此我需要检查文件夹的大小(以字节为单位)。

我有代码来计算 size of file ,但我需要文件夹的大小。

最好的方法是什么?

最佳答案

tl;博士

所有其他答案都已关闭:)

问题

我想在这个老问题上添加我的两分钱,因为似乎有很多答案都非常相似,但在某些情况下产生的结果非常不精确。

要理解为什么我们首先必须定义文件夹的大小。根据我的理解(也可能是OP之一),它是目录(包括其所有内容)在卷上使用的字节数。或者,换一种说法:

如果目录被完全删除,则可用空间。

我知道这个定义并不是解释问题的唯一有效方式,但我确实认为这是大多数用例的归结。

错误

现有的答案都采用非常简单的方法:遍历目录内容,将(常规)文件的大小相加。这没有考虑到一些微妙之处。

  • 卷上使用的空间以 block 而不是字节为单位递增。即使是一字节文件也至少使用一个 block 。
  • 文件携带元数据(如任意数量的扩展属性)。这些数据必须存放在某个地方。
  • HFS 部署文件系统压缩,以使用比实际长度更少的字节来实际存储文件。

解决方案

所有这些原因使得现有的答案产生不精确的结果。因此,我建议在 NSFileManager 上使用此扩展(由于长度原因,GitHub 上的代码: Swift 4Objective C )来解决该问题。它的速度也快了很多,特别是对于包含大量文件的目录。

该解决方案的核心是使用 NSURLNSURLTotalFileAlownedSizeKeyNSURLFileAlownedSizeKey 属性来检索文件大小。

测试

我还设置了a simple iOS test project ,展示解决方案之间的差异。它表明在某些情况下结果可能是多么完全错误。

在测试中,我创建了一个包含 100 个小文件(范围从 0 到 800 字节)的目录。从其他答案复制的 folderSize: 方法计算出总共 21 kB,而我的 allocatedSize 方法产生 401 kB。

证明

通过计算删除测试目录之前和之后卷上可用字节的差异,我确保 allocatedSize 的结果更接近正确的值。在我的测试中,差异始终完全等于 allocatedSize 的结果。

请参阅 Rob Napier 的评论,了解仍有改进的空间。

性能

但还有另一个优点:在计算包含 1000 个文件的目录大小时,在我的 iPhone 6 上,folderSize: 方法需要大约 250 毫秒,而 allocatedSize 则遍历相同的时间35 毫秒内完成层次结构。

这可能是由于使用 NSFileManager 的新的 enumeratorAtURL:includePropertiesForKeys:options:errorHandler: API 来遍历层次结构。通过此方法,您可以为要迭代的项目指定预取属性,从而减少 IO。

结果

Test `folderSize` (100 test files)
size: 21 KB (21.368 bytes)
time: 0.055 s
actual bytes: 401 KB (401.408 bytes)

Test `allocatedSize` (100 test files)
size: 401 KB (401.408 bytes)
time: 0.048 s
actual bytes: 401 KB (401.408 bytes)

Test `folderSize` (1000 test files)
size: 2 MB (2.013.068 bytes)
time: 0.263 s
actual bytes: 4,1 MB (4.087.808 bytes)

Test `allocatedSize` (1000 test files)
size: 4,1 MB (4.087.808 bytes)
time: 0.034 s
actual bytes: 4,1 MB (4.087.808 bytes)

关于ios - 如何计算文件夹的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38348076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com