如何监控iOS磁盘空间的变化?

Mat*_*t.Z -2 filesystems notifications ios

我希望我的应用程序知道磁盘可用空间何时更改并更新我的视图.系统是否发送了任何通知?

Fra*_*kH. 7

稍微偏离主题......但感觉不得不写这个.

为什么有关磁盘空间的通知变化不好?

想一想.有许多问题使得知道"可用"或"使用"空间是一个相当强烈的临时/时间点快照,因此更适合于被查询而不是被通知.

文件系统(和/或数据库)是"磁盘"之上的抽象层(为了这个帖子,我们称之为"存储设备","磁盘").这尤其意味着,假设如下:

  • 使用的磁盘空间等于(甚至接近)所有文件大小的总和
  • 可以将可用磁盘空间完全分配给新创建的文件,或者可以使用该数量增加现有文件
  • 文件的大小更改(增长或截断)将反映在空闲/已用磁盘空间的相等更改中
  • 可用磁盘空间是精确/可确切知道的数量
  • 总磁盘空间不变

不正确.

那是因为文件系统可以自由地实现以下技术:

  1. 压缩 - 使用的空间小于文件大小的总和,并使精确的自由空间不可知,因为无法预测将要写入的未来数据的压缩率
  2. 重复数据删除 - 类似的效果(在已用/可用磁盘空间上)
  3. 快照 - 使文件系统保留"已删除"数据,因此即使您认为已释放以前文件使用的空间,也不会"释放"磁盘空间
  4. 稀疏文件 - 旧技术,可以称之为"零压缩",即如果所有写的都是零,则不分配磁盘空间
  5. 空间预留 - 文件系统可以留出一定数量的空间仅供特权应用/用户使用,和/或仅用于通过特定接口使用
  6. 在线文件系统调整大小 - 可能会增加/缩小文件系统可用的磁盘总量
  7. 实时碎片整理 - 可能会合并已用空间
  8. 阻止重新分配 - 对于闪存设备,可能会导致擦除块级别的合并,并允许闪存FTL释放空间
  9. 期刊滚动 - 可能会释放或增加使用量,具体取决于日志中的事务类型
  10. ......什么不是.

此外,虽然文件大小是字节精确的,但磁盘分配是以较大的数量(块/扇区/条带/ ...)进行管理的.

因此,文件系统可以向应用程序世界提供完全静态的(从查看哪些文件和目录可见及其包含的内容)视图,例如运行在线重复数据删除/压缩/碎片整理/ ...作为后台活动的工作' ll不断更改"磁盘空间使用"统计信息,与存储和/或CPU功率允许的速度一样快.

现代文件系统(例如,许多基于闪存的存储运行)经常实现上述技术的重要子集,因此它们是否会实现一个接口,该接口将通知 "可分配磁盘空间"中的每个更改,而不是仅报告可能无意义的数据,但由于其"正常"操作可能导致大量此类通知而导致显着的性能损失.

人机工程学:

不要指望得到通知.轮询此信息 - 以合理的间隔明确查询它.不要受CPU限制,特别是不要在移动设备上,并期望"令人惊讶"的结果,即没有任何明显的用户操作的变化以及用户操作发生时没有变化.把你检索到的数据用一粒盐取出来,不要从中得出太多结论.那是你的现代文件系统......