监视文件更改时打开太多文件

2023-12-31

我正在为 iPad 开发一个基于文档浏览器的应用程序。我一直在使用SKQueue https://github.com/daniel-pedersen/SKQueue监视文件的更改,以确保当用户在文档浏览器中执行操作时其元数据保持最新。启动监控的代码:

    // Set up the queue
    let delegate = self
    queue = SKQueue(delegate: delegate)!
    // Remove all existing paths
    queue?.removeAllPaths()

    // Get the list of PDF URLs using a function that enumerates a folder's contents
    let pdfFiles = getFolderContents(rootFolder: myDocumentsFolder, extensionWanted: "pdf")
    for pdfFilePath in pdfFiles.filePaths {
        queue?.addPath(pdfFilePath.path)
    }
    for pdfFolderPath in pdfFiles.folderPaths {
        queue?.addPath(pdfFolderPath.path)
    }

我开发了自己的逻辑来响应来自该队列的通知,但在应用程序运行时我不会从队列中删除任何项目。

问题 - 似乎当观看的项目数量超过 200 个(文件和文件夹)时,系统会崩溃,控制台报告错误 24:打开的文件过多。此后,将无法执行任何文件的读/写操作。

从我从搜索中收集到的信息来看,iOS 和 iPadOS 似乎不允许同时访问超过 256 个文件描述符,这意味着监视文件更改的 GCD 方法将受到相同的限制。

有没有什么方法可以监控文件更改而不受这种限制?还有其他建议吗?


经过大量的研究和实验,我终于可以验证,对于 MacOS、iOS 和 iPadOS,允许打开的文件描述符的默认最大数量确实是 256。这可以在 MacOS 中轻松更改 - 请参阅文章here https://wilsonmar.github.io/maximum-limits/。然而,iOS 和 iPadOS 本质上更加封闭,没有可靠的方法来改变这些平台上的这一限制。

因此,良好的做法是:

  1. 尽量避免设计一个需要打开如此多文件描述符的应用程序。
  2. 监视目录,而不是单个文件。使用大多数可用于监视文件系统的工具,您会收到受监视目录中任何文件更改的通知。只需从那里实现您的逻辑,通过枚举文件夹并将其新状态与保存的状态进行比较。您可以在这个的前两个答案中找到很好的代码所以线程 https://stackoverflow.com/q/25285016/10327858.

注意:我建议使用枚举而不是其他方法来获取文件系统状态,因为其他方法往往会在模拟器和实际设备之间给出不兼容的结果(符号链接解析的不同处理)。

  1. 确保您选择的监视文件系统的方法可以查询正在监视的项目数量,并在用户接近设定限制时发出警报。请记住,256 个打开的文件还必须包括应用程序使用的所有文件,包括应用程序捆绑包中的文件和实际使用的文件。所以要留有足够的安全裕度。

就我而言,我的应用程序使用 UIDocumentBrowserViewController,或者换句话说 - Apple 自己的文件应用程序,以允许用户管理他们的文件。我必须使元数据与文件系统状态保持同步,并且我无法控制用户的文件管理习惯。更复杂的是,文件应用程序本身可用于修改应用程序的文件系统 - 而我的应用程序未处于活动状态。

因此,我做了两件事:

  1. 我将应用程序委托的 applicationDidEnterBackground 和 applicationWillTerminate 方法中的文件系统详细状态保存到应用程序支持中的 json 文件中,并在应用程序启动时将其与文件系统的新枚举进行比较 - 并提醒用户是否存在任何不匹配,建议下次使用应用程序自带的文件浏览器。
  2. 我创建了自己的 swift 包,名为SFS监控器 https://github.com/ClassicalDude/SFSMonitor,用于监视文件系统。它基于非常方便的SKQueue https://github.com/daniel-pedersen/SKQueue(我强烈推荐),但它不使用监控 kevent,而是使用 Dispatch Sources - Apple 提倡的一种更现代的方法。它类似于苹果自己的目录监视器(参考你可以找到here https://stackoverflow.com/a/61035069/10327858),但它不是监视一个目录,而是允许您创建和管理它们的整个队列。此类允许您设置受监视文件描述符的最大数量,并在达到该限制时收到通知。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

监视文件更改时打开太多文件 的相关文章

  • 适用于 iOS 的最佳存档器库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可在我的 iOS 应用程序中使用的存档器库 zip 或其他格式 就以下方面而言 最好的图书
  • 支持从右到左的纯布局

    iOS纯布局支持从右到左的语言吗 我们如何在阿拉伯语言的代码中实现它 而不需要去设置并选择区域和格式语言 Thanks 您可以通过在 Xcode gt 编辑方案 gt 运行 gt 选项 选项卡 gt 应用程序语言 gt 从右到左伪语言中选择
  • Swift TTS,无音频输出

    我尝试在我的应用程序 TTS 中集成 但如果单击按钮 则没有音频输出 这是按钮代码 struct VocabDetailView View var body some View HStack Button Play readOut text
  • AWS ios SDK - 弹性转码器作业的 http post 请求

    查看AWS弹性转码器 有几个问题 对于我的用例来说 首先使用转码器是否具有重要价值 我正在制作一个允许用户选择视频的 ios 应用程序 当他们这样做时 我会将其上传到 S3 存储桶 据我了解 我应该使用弹性转码器对这些视频进行转码 并将它们
  • 如何快速将 Int16 转换为两个 UInt8 字节

    我有一些二进制数据 将两个字节值编码为有符号整数 bytes 1 255 0xFF bytes 2 251 0xF1 Decoding 这相当简单 我可以提取一个Int16这些字节的值 Int16 bytes 1 lt lt 8 Int16
  • valgrind 和 iOS SDK 4.2?

    使用 valgrind 运行 iOS 4 2 应用程序时遇到问题 我从 Macports 安装了 valgrind 3 6 0 SVN Xcode 3 2 5 当我修改 main 以运行 valgrind 时 我得到以下输出 Detecte
  • 如何在自定义按钮单击时通过@selector传递数据?

    我正在通过代码制作一个按钮 我有以下代码行来在单击按钮时触发方法 imagesButton addTarget self action selector photoClicked forControlEvents UIControlEven
  • 在 IOS9 中的 Cordova 应用程序上使用 JQuery/Javascript 的 window.history 问题

    我在 IOS9 测试版 下使用 Cordova 应用程序时遇到问题 我正在使用最新的 Cordova 和 JQuery 移动版本 window history 未更新 导致以下故障 window history go 1 无法返回页面 即使
  • 为什么我的 UITableView 顶部有额外的填充,样式为 UITableViewStyleGrouped 在 iOS7 中

    从 iOS7 开始 我的顶部有额外的空间UITableView有一种风格UITableViewStyleGrouped 这是一个例子 tableview从第一个箭头开始 有35个像素的不明填充 然后绿色标题是UIView由返回viewFor
  • 如何在iOS 11中向集合视图大标题导航栏添加刷新控件?

    根据 Apple 的说法 刷新控件应该是 iOS 11 中大标题导航栏的一部分 当我在故事板中为 UITableViewController 启用刷新控件时 刷新控件是导航栏的一部分 拉动刷新 我无法在故事板中为 UICollectionV
  • 是否可以在 RealmSwift 中使用枚举?

    我想做这样的事情 enum WeekDay case Monday Tuesday Wednesday Thursday Friday Saturday Sunday class Person Object dynamic var birt
  • 用强/弱自我打破保留周期

    我读过关于强 弱的帖子self打破保留周期 但我仍然对它们如何工作感到困惑 我理解使用 weak typeof self weakSelf self创建对自我的弱引用 但我对强引用感到困惑 据我了解 强引用是指对self这样它就不会在块结束
  • UITableView 的 reloadRowsAtIndexPaths: (NSArray *) indexPaths 无法导致重新加载,除非您调用它两次?

    我有一个 UITableViewController 管理 iPad 应用程序中的 UITableView 对象 表格视图与相当复杂的其他对象群联系在一起 当我要求它重新加载行时遇到问题 如下所示 indexPath is an NSInd
  • 电子邮件在 ShareKit 中不起作用并且没有错误

    我正在使用 ShareKit 将 Facebook Twitter 和电子邮件共享添加到我的 iPhone 应用程序中 现在 Facebook 和 Twitter 可以使用 但电子邮件无法使用 最大的问题是没有错误或任何错误 它正常工作 但
  • 在 RealityKit 中更改对象的枢轴点

    我希望立方体仅在 z 轴正方向上缩放 现在 当我缩放它时 它总是围绕其中心缩放 因此 为此我必须更改对象的锚点 我知道在 SceneKit 中有一个可以使用的枢轴属性 在 RealityKit 中也有办法做到这一点吗 我发现了一个相当简单的
  • 为什么Android和IOS11无法通过NFC通信

    目前正在使用 React Native 并尝试使用反应本机 NFC ios https www npmjs com package react native nfc ios and 反应本机 NFC https github com Nov
  • 如何在iPhone上绘制“对话气泡”?

    当您右键单击扩展坞中的某个内容时 我试图获得类似于 Mac OS X 中的 语音气泡 效果 这是我现在所拥有的 我需要得到下部的 三角形 部分 有什么办法可以画出这样的东西并在它周围加上边框吗 这将是为了iPhone app 提前致谢 ED
  • 如何在 iOS 中使用 Dropbox API 用父版本覆盖文件?

    我正在使用 Dropbox API 开发 iOS 应用程序 使用 dropbox API 上传文件时 我只想覆盖同名的现有文件 如何设置父转速以及什么值 谢谢 获取目录中的所有文件 self restclient loadMetadata
  • 在 SwiftUI TextEditor 中设置光标位置

    有没有办法以编程方式将光标移动到特定文本行或在 SwifUI 中选择它TextEditor 例如 如果有一个TextEditor里面写着10行 当用户按下按钮时 光标将导航到第三行 或者文本将被选择 目前使用默认的 SwiftUI 是不可能
  • iOS UITest:如何找到UITableViewCell的AccessoryView?

    你好我正在学习UITests now 我有个问题 如何检测accessoryView的点击tableViewCell 在UI测试中 下面是我的tableViewCell 我想要检测细节闭合配件视图水龙头 像这样 app tables cel

随机推荐

  • 什么是 deep_ping [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我不确定这是否是提问的正确论坛 但我也不知道在哪里提问 所以这是我的问题 深平 是什么意思 我尝试了谷歌 但仍然没有得到任何有关它的信息 另外 深度
  • DataTemplate 中的 TextBlock 忽略了 FontSize 样式

    TextBlock 的样式 如下 对 DataTemplate 的 TextBlock 没有影响 如果我在样式和模板中将 TextBlock 更改为 TextBox 则样式将按我的预期应用 为什么 TextBlock 会忽略样式 谢谢你 B
  • Android 撰写文本的自动链接

    有什么办法可以使用吗安卓 自动链接JetPack Compose Text 上的功能 我知道 在一个简单的标签 修饰符中使用此功能可能不是 声明性方式 但也许有一些简单的方法 对于文本样式我可以使用这种方式 val apiString An
  • 获取 R 中均值子组的均值

    我是 R 的新手 我不知道如何让 R 计算子组的平均值 而子组本身就是子组的平均值 我会解释得更清楚 我有一个像这样的数据框 GROUP WORD WLN 1 1 4 1 1 3 1 1 3 1 2 2 1 2 2 1 2 3 2 3 1
  • Python在同一个图上并排箱线图

    我正在尝试在 Python 2 7 中为下面 Pandas 数据框中 E 列中的每个分类值生成一个箱线图 A B C D E 0 0 647366 0 317832 0 875353 0 993592 1 1 0 504790 0 0418
  • Python - 反转列表中字符串的函数

    疯狂地学习Python 并且有很多很多的问题 这次关于函数 我需要创建两个函数 第一个函数用于数字来总结用户在列表中输入的所有内容 第二个函数是用户在列表中输入一些单词 并且函数不触及列表中的单词索引 取每个函数单词并返回相反的单词 在同一
  • Tensorflow - 平均恢复模型的模型权重

    鉴于我在相同的数据上训练了多个不同的模型 并且我训练的所有神经网络都具有相同的架构 我想知道是否可以恢复这些模型 平均它们的权重并使用平均值初始化我的权重 这是图表外观的示例 基本上我需要的是我要加载的重量的平均值 import tenso
  • javascript中的dispatchEvent所有元素

    有没有办法调度所有元素 例如 我们可以这样做window dispatchEvent evt 但我想允许所有元素使用该事件 对于onclick 我们可以使用几乎所有元素 var evt document createEvent MouseE
  • 如何循环遍历 JSON 中的条目?

    我想循环 JSON 文件的内容并将其打印到控制台 我想我确实把一些东西和列表混淆了 这就是我试图得到的所有team name元素 from urllib2 import urlopen import json url http openli
  • Python 子进程调用,参数具有多个引号

    我在 bash 中使用以下命令来执行 Python 脚本 python myfile py c USA g CA 0 2011 10 13 1 2011 10 27 我正在编写一个 Python 脚本来解决这个问题 我目前不得不使用 os
  • 按年份选择前 n%

    我构建了一个查询 可返回截至最近完成的月份的年初至今净销售额 查询联合发票和贷项凭证的总计 效果很好 我在另一个工具中使用查询 该工具通过卡代码求和 并允许我进行有趣的数据透视等 这是该查询 select x cardcode x cust
  • 如何访问 Android 的默认蜂鸣声?

    我想让一个按钮发出蜂鸣声来表明它已被按下 我想知道如何使用默认的 Android 蜂鸣声 例如调整铃声音量时 而不是导入我自己的 mp3 音乐文件或使用 ToneGenerator 使用默认的 android 蜂鸣声 就像当你调整 铃声音量
  • 双重爆炸数组

    字符串 user hello user2 world 期望的输出 string array 1 gt array 1 gt user 2 gt hello 2 gt array 1 gt user2 2 gt world 我尝试过的 不起作
  • Java 类路径问题

    我有两节课 我的应用程序 Library 该库已被编译为Library class 并且源代码不再可用 我现在正在尝试从源代码编译 MyApplication MyApplication 依赖于库 该库的包名称为 org myCompany
  • 分析来自谷歌文档表单的多重响应字段

    我用 Google Doc 制作的一份调查问卷有一个多重响应集 假设三个可能的问题是 foo bar foobar 允许人们勾选一个或多个答案 在我的谷歌电子表格结果中 我有 answer1 foo answer2 foo bar answ
  • @font-face 用于自定义字体,Chrome 中的字体不平滑

    我有一个 Web 应用程序 它使用 CSS3 的 font face 来嵌入自定义字体 到目前为止 这在 IE 和 Firefox 中都可以完美运行 然而 在 Chrome 中 自定义字体显得像素化且不平滑 下面是 Firefox IE 上
  • IE8 将动态 iframe 内容从缓存重新加载到错误的 iframe 中

    我有一个页面 上面有多个 iframe 每个 iframe 都会调用一些 javascript 动态地将新的 iframe 写入父窗口的文档中 这在首页加载时效果很好 但是 如果在 IE8 及更早版本 中刷新页面 动态生成的 iframe
  • 如何将用户重定向到 ACS 默认登录页面

    我正在使用天蓝色Access Control System ACS 在我的网络应用程序中对来自不同身份提供商的用户进行身份验证 我成功注册了使用 ACS 的申请 现在 我通过从 web config 文件中删除以下内容 删除了 ACS 的完
  • 从文本观察器访问编辑文本

    我正在使用 textWatcher final EditText et EditText findViewById R id editText1 final TextView tv TextView findViewById R id te
  • 监视文件更改时打开太多文件

    我正在为 iPad 开发一个基于文档浏览器的应用程序 我一直在使用SKQueue https github com daniel pedersen SKQueue监视文件的更改 以确保当用户在文档浏览器中执行操作时其元数据保持最新 启动监控