मैं FSEvents
का उपयोग कर कोको प्रोजेक्ट में निर्देशिका और डिस्क परिवर्तनों को सुन रहा हूं। जब रूट फ़ोल्डर का नाम बदल दिया जाता है या हटा दिया जाता है तो मुझे ईवेंट प्राप्त करने की आवश्यकता होती है। तो, FSEventStream
बनाते समय, मैंने kFSEventStreamCreateFlagWatchRoot
पारित किया। लेकिन अगर मैं रूट फ़ोल्डर को हटा या नाम बदलता हूं तो मुझे संबंधित FSEventStreamEventFlags
नहीं मिल रहा है। कोई विचार क्या संभवतः मुद्दा हो सकता है। मैं एक यूएसबी माउंटेड डिवाइस में बदलावों के लिए सुन रहा हूँ। मैंने FSEventStreamCreate
और FSEventStreamCreateRelativeToDevice
दोनों का उपयोग किया। एक बात मैं नोटिस है जब मैं FSEventStreamCreate
मैं निम्न त्रुटि संदेश मिलता है के साथ की कोशिश करते हुए FSEventStream
बनाने:फ़ाइल सिस्टम के लिए कैसे सुनें मैक - केएफएसईवेंटस्ट्रीमक्रेटफ्लैगवैच रूट
(
CarbonCore.framework
)FSEventStreamCreate
:watch_all_parents
:
त्रुटिfd 7
के लिए kqueue जोड़ने की कोशिश कर (/Volumes/NO NAME
; कार्रवाई समर्थित नहीं)
लेकिन FSEventStreamCreateRelativeToDevice
के साथ कोई त्रुटि नहीं है लेकिन अभी भी kFSEventStreamEventFlagRootChanged
ईवेंट झंडे में नहीं मिल रही है। साथ ही, FSEventStreamCreateRelativeToDevice
सेब का उपयोग करते हुए सृजन का कहना है कि अगर मैं रूट पथ परिवर्तनों को सुनना चाहता हूं तो emty string ""
पास करें। लेकिन मैं खाली स्ट्रिंग पास करके रूट पथ परिवर्तनों को सुनने में सक्षम नहीं हूं। लेकिन जब मैं "/"
पास करता हूं तो यह काम करता है। लेकिन "/"
के लिए भी मुझे कोई उचित FSEventStreamEventFlags
नहीं मिलता है। मैं कोड यहाँ चिपकाने हूँ:
-(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);
}
कॉल वापस समारोह:
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]]);
}
}
धन्यवाद अग्रिम में एक बहुत।
मुझे यकीन नहीं है कि वहां क्या गलत है क्योंकि मैंने कभी भी FSEvents का उपयोग नहीं किया है। ऐसा कहकर, ऐसा लगता है कि आप जो करने की कोशिश कर रहे हैं वह डिस्क आर्बिट्रेशन फ्रेमवर्क का उपयोग करके बेहतर किया जा सकता है। –