繁体   English   中英

(OS X)确定是否正在写入文件?

[英](OS X) Determine if file is being written to?

我的应用程序正在监视本地文件系统上某处的“热”文件夹,以将新添加的文件推送到网络位置。 当将非常大的文件写入热文件夹时,我遇到了一个问题:通知我有关热文件夹中的更改的文件系统事件将在文件完成写入之前触发。 当我的应用尝试上载文件时,它会将文件大小误读为当前复制的字节数,而不是最终的总字节数。

我尝试过的事情:

  • NSURL getResourceValue:forKey:error:读取NSURLAllocatedFileSizeKey (相同的值NSURLFileSizeKey而文件正被写入)。
  • NSFileManager attributesOfItemAtPath:error:查看NSFileBusy (总是NO)。

我似乎找不到任何机制来重复轮询文件的大小以确定文件是否已完成复制并可以上传。

没有很棒的方法可以做到这一点。

如果可以确定编写者正在使用NSFileCoordinator ,那么还可以使用它来协调对文件的访问。

同样,如果您确定作者已选择咨询锁定,则可以尝试通过使用O_SHLOCKO_NONBLOCK标志调用open()来尝试打开文件以进行共享访问。 如果成功,则没有其他描述符可打开以进行独占访问。 您可以使用已有的文件描述符或将其关闭,然后使用其他一些API来访问文件。

但是,如果不能确定其中任何一个,那么最好的选择是设置一个计时器来重复检查文件的元数据(大小,修改日期等)。 只有当您看到它已在合理的时间间隔(可能是2秒)内停止更改时,您才尝试访问它(并取消计时器)。

您可能要同时做这三个。 等待文件的元数据稳定下来,然后使用NSFileCoordinator从文件中读取。 当它调用您的阅读器块时,请使用open()O_SHLOCK | O_NONBLOCK O_SHLOCK | O_NONBLOCK以确保没有其他进程对其具有独占访问权。

您需要某种形式的协调文件锁定。

fcntl()和flock()是此功能的常用功能。 请先阅读。 然后查看您有哪些选择。 如果您可以控制其他进程的代码库,那就更好了。

大型文件的问题在于,其中更改或更改的内容是不透明的,并不总是结尾。 好的过程通常应该执行原子写入。 (写入临时文件,然后换出),但是如果这些文件实际上是数据库,那么您将需要使用db的服务器应用程序来进行此类操作。

如果文件是包含其他文件的包装器,则将变得更加混乱,因为这些内容可能彼此依赖,从而处于可用状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM