Tôi đang nghe các thay đổi về Thư mục và đĩa trong một dự án Cocoa sử dụng FSEvents
. Tôi cần nhận các sự kiện khi thư mục gốc được đổi tên hoặc xóa. Vì vậy, tôi đã thông qua kFSEventStreamCreateFlagWatchRoot
khi tạo FSEventStream
. Nhưng ngay cả khi tôi xóa hoặc đổi tên thư mục gốc, tôi không nhận được FSEventStreamEventFlags
tương ứng. Bất kỳ ý tưởng nào có thể là vấn đề. Tôi đang nghe những thay đổi trong thiết bị được gắn USB. Tôi đã sử dụng cả hai FSEventStreamCreate
và FSEventStreamCreateRelativeToDevice
. Một điều tôi thông báo là khi tôi thử với FSEventStreamCreate
tôi nhận được thông báo lỗi sau khi tạo FSEventStream
:Cách nghe các thay đổi của hệ thống tập tin MAC - kFSEventStreamCreateFlagWatchRoot
(
CarbonCore.framework
)FSEventStreamCreate
:watch_all_parents
:
lỗi khi cố gắng thêm kqueue chofd 7
(/Volumes/NO NAME
; Operation không được hỗ trợ)
Nhưng với FSEventStreamCreateRelativeToDevice
không có lỗi nhưng vẫn không nhận được kFSEventStreamEventFlagRootChanged
trong cờ sự kiện. Ngoài ra, trong khi tạo bằng cách sử dụng FSEventStreamCreateRelativeToDevice
táo nói nếu tôi muốn nghe những thay đổi đường dẫn gốc vượt qua chuỗi emty ""
. Nhưng tôi không thể nghe những thay đổi đường dẫn gốc bằng cách truyền chuỗi rỗng. Nhưng khi tôi vượt qua "/"
nó hoạt động. Nhưng ngay cả đối với "/"
Tôi không nhận được bất kỳ FSEventStreamEventFlags
thích hợp nào. Tôi đang dán mã ở đây:
-(void) subscribeFileSystemChanges:(NSString*) path
{
PRINT_FUNCTION_BEGIN;
// if already subscribed then unsubscribe
if (stream)
{
FSEventStreamStop(stream);
FSEventStreamInvalidate(stream); /* will remove from runloop */
FSEventStreamRelease(stream);
}
FSEventStreamContext cntxt = {0};
cntxt.info = self;
CFArrayRef pathsToWatch = CFArrayCreate(NULL, (const void**)&path, 1, NULL);
stream = FSEventStreamCreate(NULL, &feCallback, &cntxt,
pathsToWatch, kFSEventStreamEventIdSinceNow, 1,
kFSEventStreamCreateFlagWatchRoot);
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(),
kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
}
Gọi lại chức năng:
static void feCallback(ConstFSEventStreamRef streamRef, void* pClientCallBackInfo,
size_t numEvents, void* pEventPaths, const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
char** ppPaths = (char**)pEventPaths; int i;
for (i = 0; i < numEvents; i++)
{
NSLog(@"Event Flags %lu Event Id %llu", eventFlags[i], eventIds[i]);
NSLog(@"Path changed: %@",
[NSString stringWithUTF8String:ppPaths[i]]);
}
}
Thanks a lot trước.
Tôi không chắc là có gì sai vì tôi chưa từng sử dụng FSEvents. Có nói rằng, nó âm thanh như những gì bạn đang cố gắng để làm có thể được thực hiện tốt hơn bằng cách sử dụng khuôn khổ DiskArbitration. –