iOS上删除大文件文件夹的性能

2024-03-09

假设我的 iOS 应用程序的数据目录中有一个文件夹,其中包含数千个小文件。删除此文件夹(通过[NSFileManager removeItemAtPath])需要相当长的时间。但在 OS X 上,删除具有相同内容的文件夹非常快。它似乎只是从文件系统中取消文件夹的链接。那么为什么 iOS 需要这么长时间呢?有什么不同?

编辑:在 iPad 3 上,删除 3 个文件夹(每个文件夹包含 5,000 到 9,000 个文件)大约需要 35 秒。在旧版 Retina MBP 上运行的模拟器上,大约需要 1.5 秒。


您看到的层次结构不是“真实的”——目录 不是它们看起来包含的文件的物理容器。 目录层次结构是精心维护的虚构作品。

撇开无关紧要不谈:最初的 Mac 文件系统迈出了这一步 更进一步——它使目录结构完全成为视觉小说 -- 所有文件都位于(3.5 英寸)软盘的根目录中,并且仅seemed排列在文件夹中。幸好这是 被 HFS 取代。

最好将目录/文件夹视为一种特殊类型的文件 包含要访问的一组文件的索引pretend包含装有。

从概念上讲,这与经典的 Cocoa 内存管理非常相似。 每个(目录/对象)通过引用“拥有”一组(文件/对象) (“保留”(文件/对象))。

当您从目录中删除文件时,该文件就被“释放”。如果没有其他 目录对该文件有所有权声明,它被“释放”。

您的(文件夹/对象)不包含它“拥有”的对象。它 甚至并不真正“拥有”它们——它只是对它们有“所有权主张” 他们。

来自维基百科有关硬链接的文章:

“硬链接是一个目录条目,它将名称与文件系统上的文件关联起来。目录本身就是一种特殊的文件, 包含此类条目的列表。”

请注意,由于使用了硬链接,因此可能有一个 可以出现在多个目录中的物理文件。每一项 这些目录拥有对“真实”文件的引用。每个参考 和其他任何东西一样“真实”。所有引用都必须“取消链接” 要标记为已删除的文件。

“文件”甚至可以在不同的地方有不同的“名称” 目录!

硬链接是文件系统功能的链锯——功能强大,但是 可能相当危险。请注意,OSX GUI 没有提供任何方法 生成硬链接,甚至符号链接。

From 此电子邮件列表项 http://lists.apple.com/archives/cocoa-dev/2010/Oct/msg00087.html.

现在介绍一下 iOS

[NSFileManager removeItemAtPath: error:],它在 引擎盖是他们迭代子目录和文件并删除 他们先。这需要一些时间。我有兴趣是否可以 立即执行此操作,甚至不需要隐式递归。只需删除 目录和文件和子目录会消失吗?

你能做的是

  1. 如果您担心这会花费时间并且需要即时结果,您可以重命名该文件夹(几乎是即时的),然后在后台线程中删除重命名的文件夹及其内容。

  2. 如果时间有限,请尝试在后台线程中运行删除进程(如果不是问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS上删除大文件文件夹的性能 的相关文章

  • 如何在Sprite Kit中实现鼠标关节?

    我已经在 iOS 上用 Cocos2d Box2d 编写了拖放功能的工作实现 我需要将它移植到 Sprite Kit 逻辑非常基本 当用户触摸屏幕时 找到手指下的精灵 在找到的精灵和场景的物理体之间创建鼠标关节 将关节的目标设置为触摸位置
  • 子类 PFObject 上的 PFUser 属性

    我使用以下类 动态属性以及 m 文件中的 load 和 parseClassName 方法 对 PFObject 进行了子类化 interface DAOpponents PFObject
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且
  • 即使在急切加载之后,belongs_to 关联也会单独加载

    我有以下关联 class Picture lt ActiveRecord Base belongs to user end class User lt ActiveRecord Base has many pictures end 在我的
  • WKWebView 未打开自定义 URL 方案(js 在新窗口中打开自定义方案链接)

    我有一个WKWebView在我的应用程序中 我不使用UIWeb视图 因为由于某种奇怪的原因 它无法正确打开包含大量 JS 代码的网页 当我点击链接时自定义 url 方案 scm 它确实nothing My code void viewDid
  • 从 NavigationController 中删除 ViewController 后 AVPlayer 继续播放

    因此 我在项目中使用 ARC 当我添加 AVPlayerLayer 时 它工作得很好 但当我从 UINavigationItem 中弹出 UIViewController 时 视频继续在后台播放 有谁知道你会如何处理这个问题 这似乎是一件很
  • 使 iOS 应用程序与 iPhone 6 和 iPhone 6 尺寸兼容 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我创建了一个应用程序 其中使用 xib 进行布局 目前我使用两种不同的 xib 一种用于iPhone4 320 480 一种用于iPh
  • 重叠的装载机圆

    我试图重现苹果为应用程序 活动 制作的重叠圆圈 见下图 如果您使用标准贝塞尔路径 起始 结束位置将仅在 0 到 2PI 之间产生影响 例如 如果您尝试填充 4PI 即使使用一些阴影 则无法模拟重叠加载 如何制作类似于苹果解决方案的东西来创建
  • 如何解决malloc_error_break?

    我在 iOS 3 0 模拟器上遇到此错误 但在 3 1 3 和 3 2 模拟器上没有遇到此错误 创建符号断点后malloc error break 我在日志中看到了这一点 Session started at 2010 02 13 19 1
  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi
  • 通过 renderInContext 定位要绘制的视图:

    我想画一个UIView在我目前的CGGraphicsContext 我画的是UIView via renderInContext 但它的位置不正确 始终位于左上角 我拥有所有的价值观UIView可用于绘制UIView CGRect fram
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • 沙盒尝试恢复消耗性 IAP

    我一直在尝试在 iOS 上测试一些消耗性 IAP 但遇到了一个奇怪的错误 弹出一条警报 其中包含以下文本 此应用内购买已被购买 它将恢复为 自由的 环境 沙盒 我已经检查过 并且确定我的 IAP 可以在 iTunesConnect 中使用
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • ios - Gamekit 的 GKOctree 未找到元素

    我正在尝试使用GKOctree https developer apple com documentation gameplaykit gkoctree用于高效检索 3D 空间中的对象 然而 以下代码似乎没有按预期工作 import Gam
  • 如何将相机中的图像保存到 iPhone 图库中的特定文件夹?

    嘿 我是 iPhone 新手 最近我一直在尝试制作一个应用程序 基本上 我想要做的是 如果用户将从相机捕获任何图像 那么它应该保存在设备库中 我知道如何将照片保存在图库中 它对我有用 但我无法将所有捕获的图像保存到设备图库中的特定文件夹 例
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将

随机推荐