Tôi đang xem thư mục cho các sự kiện hệ thống tệp. Mọi thứ dường như hoạt động tốt với một ngoại lệ. Khi tôi tạo một tập tin lần đầu tiên, nó phun ra rằng nó đã được tạo ra. Sau đó, tôi có thể xóa nó và nó nói rằng nó đã được gỡ bỏ. Khi tôi tạo lại cùng một tệp, tôi nhận được cả cờ được tạo và xóa cùng một lúc. Tôi rõ ràng là sự hiểu lầm làm thế nào các lá cờ đang được thiết lập khi gọi lại đang được gọi. Chuyện gì đang xảy ra ở đây?OSX FSEventStreamEventFlags không hoạt động chính xác
//
// main.c
// GoFSEvents
//
// Created by Kyle Cook on 8/22/13.
// Copyright (c) 2013 Kyle Cook. All rights reserved.
//
#include <CoreServices/CoreServices.h>
#include <stdio.h>
#include <string.h>
void eventCallback(FSEventStreamRef stream, void* callbackInfo, size_t numEvents, void* paths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) {
char **pathsList = paths;
for(int i = 0; i<numEvents; i++) {
uint32 flag = eventFlags[i];
uint32 created = kFSEventStreamEventFlagItemCreated;
uint32 removed = kFSEventStreamEventFlagItemRemoved;
if(flag & removed) {
printf("Item Removed: %s\n", pathsList[i]);
}
else if(flag & created) {
printf("Item Created: %s\n", pathsList[i]);
}
}
}
int main(int argc, const char * argv[])
{
CFStringRef mypath = CFSTR("/path/to/dir");
CFArrayRef paths = CFArrayCreate(NULL, (const void **)&mypath, 1, NULL);
CFRunLoopRef loop = CFRunLoopGetMain();
FSEventStreamRef stream = FSEventStreamCreate(NULL, (FSEventStreamCallback)eventCallback, NULL, paths, kFSEventStreamEventIdSinceNow, 1.0, kFSEventStreamCreateFlagFileEvents | kFSEventStreamCreateFlagNoDefer);
FSEventStreamScheduleWithRunLoop(stream, loop, kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
CFRunLoopRun();
FSEventStreamStop(stream);
FSEventStreamInvalidate(stream);
FSEventStreamRelease(stream);
return 0;
}
tương tự vấn đề: https://github.com/haskell-fswatch/hfsnotify/issues/36 –
Từ mã gọi lại của bạn, tôi không thấy bất kỳ cách nào bạn có thể xóa cả hai và tạo cùng một lúc. Chúng phải được in trong các cuộc gọi lại riêng biệt. (Bạn có nếu() else if().) –
Bạn đã kiểm tra xem việc xóa cờ 'kFSEventStreamCreateFlagNoDefer' có thay đổi gì không? – JSuar