【问题标题】:How to detect if a file was closed?如何检测文件是否已关闭?
【发布时间】:2023-03-10 15:07:01
【问题描述】:

是否可以检测文件(例如在预览中打开的 pdf 文件)是否已关闭?

FSEvents API 不会触发此类事件。

也许我可以观察相关的过程或类似的东西?!

【问题讨论】:

  • 文件还是文档?如果是后者,为什么需要知道文档已关闭?可能有更好的方法来做你真正想做的事。

标签: macos cocoa filesystems nsfilemanager fsevents


【解决方案1】:

是的,您可以通过某种方式确定文件是否已关闭。所以在下面我尝试使用 unix lsof -t yourFilePath 命令来确定相同的,因此在可可中实现了相同的。请按照下面的操作 lsof -t yourFilePath 将为您提供仅打开文件的进程 ID。这样您就可以轻松检测哪些文件已关闭:-

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/bash"];
NSString *yourFilePath=@"/Users/Home/Desktop/test.doc";
[task setArguments:[NSArray arrayWithObjects: @"-c",[NSString stringWithFormat:@"%@ %@ %@",@"lsof",@"-t",yourFilePath],nil]];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];

NSFileHandle *file;
file = [pipe fileHandleForReading];

[task launch];

NSData *data;
data = [file readDataToEndOfFile];
NSString *response = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
if ([response length] > 0)
{
NSLog(@"test.doc file has been opened and process id is %@",response);
}
else
{
NSLog(@"test.doc file has been closed");
}

【讨论】:

  • 这也将帮助您确定打开的文件
  • 你为什么要为此运行 bash?!将由空格连接的三个字符串组成的“脚本”装在一起是询问“不适用于包含空格或其他'特殊字符'的路径”错误。这里不需要 shell 脚本——你可以直接通过它自己的路径识别 lsof 并直接在数组中传递两个参数。
  • @Peter Hosey,我同意你的观点,这就是为什么我提到没有任何特殊字符的路径。但我的观点是,cocoa 是否提供任何 api 来检测任何文件是打开还是关闭?
  • 不,您从未在此答案中提及该限制。您所做的是提供在传递包含空格或其他 shell 特殊字符的路径时将失败的代码。显示不会破坏代码的示例路径与提及会破坏代码的案例不同。
  • 谢谢@hussainShabbir...现在我可以检测文件是否已关闭...但我的 PDF 文件有问题...lsof 命令不显示PDF 文件是打开的,因为当我打开 PDF 文件时,它是以 root 用户身份打开的……你知道它为什么以 root 用户身份打开吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2013-11-08
  • 2012-03-04
  • 1970-01-01
  • 2015-01-21
相关资源
最近更新 更多