gpt4 book ai didi

objective-c - 当我修改文件时发送 kevent NOTE_DELETE

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:40 25 4
gpt4 key购买 nike

我尝试在文件上使用 kqeue 和 kevent,当我的文件被修改时,我将更新我的软件。当我的文件被删除时,我删除了我软件中的链接。

所以我初始化kqueue

void myfct(char * path)
{
int kq;
int event_fd;
struct kevent events_to_monitor[NUM_EVENT_FDS];
struct kevent event_data[NUM_EVENT_SLOTS];
void *user_data;
struct timespec timeout;
unsigned int vnode_events;

kq = kqueue();

event_fd = open(path, O_EVTONLY);
user_data = path;
timeout.tv_sec = 0;
timeout.tv_nsec = 500000000;

vnode_events = NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE;
EV_SET( &events_to_monitor[0], event_fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, vnode_events, 0, user_data);

while (42)
{
int event_count = kevent(kq, events_to_monitor, NUM_EVENT_SLOTS, event_data, num_files, &timeout);

if (event_count)
{
// Display the right event in event_data[0].fflags
}
else
{
NSLog(@"No event.\n");
}
}
}

然后当我调用kevent并修改我的文件

我得到了 NOTE_ATTRIB 事件,然后是 NOTE_DELETE ...为什么?

最佳答案

正如 arri 在评论中所解释的那样:

许多应用程序和框架在保存时实际上不会覆盖您的文件。相反,他们创建一个新的临时文件,写入该文件,将属性从旧文件复制到临时文件(触发 NOTE_ATTRIB),然后将临时文件重命名为旧文件(触发NOTE_DELETE)。

这称为“原子保存”。优点是它是原子的:要么整个保存有效,要么什么都不改变;即使有人在最糟糕的时候意外拔下硬盘,您也不可能得到乱码或不完整的文件。而且,虽然丢失自上次保存以来的所有更改可能很糟糕,但丢失文件的最后 90% 通常更糟。

关于objective-c - 当我修改文件时发送 kevent NOTE_DELETE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10803181/

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