gpt4 book ai didi

objective-c - 观察文件大小变化

转载 作者:行者123 更新时间:2023-12-03 17:11:36 27 4
gpt4 key购买 nike

我需要监视文件夹中的文件 - 文件将放入文件夹中,并且可能需要几秒钟或几分钟才能完成文件复制。我已经阅读了有关 SO 的多个主题( Checking File sizes for changesDetect file in use by other process )。这些都没有给出很好的答案。

轮询“不好”,但我如何知道文件大小是否停止增加?具体来说,是否有“文件大小恒定”或“文件已完成”的通知?操作系统可以通知非事件(IOW,你如何证明否定?)。在我看来,从逻辑上讲,人们必须轮询文件以查看它是否没有更改。我还检查了 SCEvents 和 UKKQueue,但同样,两者都只通知更改。 UKKQueue有“文件大小增加”的方法,但没有“文件大小未增加的方法”。

是否真的有办法在不轮询或使用 sleep() 的情况下检测文件复制完成情况?

最佳答案

这是我用来在本地监视文件的代码。我不确定这是否适合您。

int fileHander = open("/location/file", O_RDONLY);
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
unsigned long mask = DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE;
__block dispatch_source_t source;

void (^changeHandler)(void) = ^{
unsigned long l = dispatch_source_get_data(source);
if (l & DISPATCH_VNODE_DELETE) {
printf("file deleted");
dispatch_source_cancel(source);
}
else {

printf("file data changed");
}
};
void (^cancelHandler)(void) = ^{
int fileHander = dispatch_source_get_handle(source);
close(fileHander);
};

source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE,fileHander, mask, queue);
dispatch_source_set_event_handler(source, changeHandler);
dispatch_source_set_cancel_handler(source, cancelHandler);
dispatch_resume(source);

关于objective-c - 观察文件大小变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23526807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com