2009-09-06 6 views
18

में किसी फ़ाइल या फ़ोल्डर का निरीक्षण करें फ़ोल्डर या फ़ाइल को सुनने के लिए सबसे अच्छा तरीका क्या है यह देखने के लिए कि क्या यह सहेजा गया है या कोई नई फ़ाइल जोड़ दी गई है?उद्देश्य-सी

उत्तर

32

FSEvents API आदर्श है यदि आप केवल निर्देशिका देखना चाहते हैं लेकिन यह व्यक्तिगत फ़ाइलों की निगरानी को संभाल नहीं करता है। स्टू कोनोली FSEvents सी एपीआई के लिए एक महान ऑब्जेक्टिव-सी आवरण है, यह SCEvents कहा जाता है और आप इसे यहाँ प्राप्त कर सकते:

http://stuconnolly.com/blog/scevents-011/

FSEvents के बारे में अच्छी बात यह है कि आप सिर्फ एक फ़ोल्डर और आप देखने की जरूरत है वह यह है कि उस फ़ोल्डर के उपफोल्डर पदानुक्रम में कहीं भी होने वाले किसी भी बदलाव की अधिसूचना दी जाएगी।

यदि आपको फ़ाइल-स्तरीय नोटिफिकेशन की आवश्यकता है तो आपको kqueues का उपयोग करने की आवश्यकता होगी।

इन तरीकों में से

http://zathras.de/angelweb/sourcecode.htm#UKKQueue

या तो सीधे सी API के साथ तकरार की तुलना में बहुत आसान है, जो विशेष रूप से अच्छी तरह से प्रलेखित नहीं कर रहे हैं और थोड़ा सुस्त: उली Kusterer एक महान ऑब्जेक्टिव-सी आवरण है।

यदि आपको टाइगर का समर्थन करने की आवश्यकता है तो आपको Kqueues का उपयोग करने की आवश्यकता होगी क्योंकि FSEvents API आधिकारिक तौर पर 10.4 में उपलब्ध नहीं था।

+5

मैक ओएस 10.7 शेर के बाद से चीजें बदल गई हैं।FSEvents अब फ़ाइल-स्तरीय ग्रैन्युलरिटी का समर्थन करते हैं, विशेष फ़ाइलों में परिवर्तनों के बारे में सूचित होने के लिए ईवेंट स्ट्रीम बनाते समय kFSEventStreamCreateFlagFileEvents ध्वज का उपयोग करें। FSEvent मार्गदर्शिका इन परिवर्तनों को प्रतिबिंबित नहीं करती है, लेकिन [संदर्भ] (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/FSEvents_Ref/Reference/reference.html#//apple_ref/c/econst/kFSEventStreamCreateFlagFileEvents) करते हैं। –

+0

सैंडबॉक्स प्रतिबंधों के बारे में कैसे? क्या सिस्टम में किसी भी पथ के लिए नोटिफिकेशन प्राप्त करना संभव है? (उपयोगकर्ता के बाद इसे विशेष संवाद के साथ चुनता है) – Vojto

+0

अच्छा सवाल। मेरा मानना ​​है कि अगर आपने 'NSOpenPanel' (यानी पावरबॉक्स) का उपयोग करके फ़ोल्डर चुना है तो आप इसे किसी भी समस्या के बिना परिवर्तनों के लिए देख पाएंगे। –

-3

सुनिश्चित नहीं है कि सबसे अच्छा तरीका क्या है, लेकिन एक तरीका एक एनएसटीएचड को आग लगाना होगा जो नियमित रूप से (उदाहरण के लिए हर सेकेंड) निर्देशिका में फ़ाइलों की निर्माण तिथियों की जांच करेगा, और उसके बाद उस धागे से जुड़े प्रतिनिधि होंगे , जब एक नई फ़ाइल जोड़ दिया गया है

+11

यह मतदान है और निराश है। इसके बजाय FSEvents या kqueues का उपयोग करें, जो इस उद्देश्य के लिए स्पष्ट रूप से डिज़ाइन किए गए एपीआई हैं। –

+2

पोलिंग निराश है, हालांकि यह भी एकमात्र विश्वसनीय तकनीक है। जब पॉलिसी एक अलग मशीन द्वारा संशोधित की जाती है तो पॉलिंग नेटवर्क वॉल्यूम्स पर भी * सभी * समय काम करेगी। हर किसी को कम से कम इसका इस्तेमाल करने पर विचार करना चाहिए। –

+0

विस्तृत करने के लिए "केवल विश्वसनीय तकनीक" देखभाल? केंद्रीय घटनाओं के लिए सुनना बेहतर विकल्प लगता है। बैटरी के अनुसार – eonist

6

FSEvents उपयोग करने का प्रयास कुछ कार्रवाई करने के लिए, हालांकि यह एक सी एपीआई

ओएस है 10.5 या नए

+0

इन दिनों github पर FSEvent wrapper libs के बहुत सारे। स्विफ्ट – eonist

1

आप एक फ़ाइल या फ़ोल्डर बदल रहे हैं, मेरा मानना ​​है कि Spotlight खोज इंजन आपके परिवर्तनों को दर्शाने के लिए अपने डेटाबेस को अपडेट करेगा।

तो तुम एक धागा है कि एक Spotlight query कि फ़ाइल या फ़ोल्डर के लिए विशिष्ट के माध्यम से kMDQueryDidUpdateNotification सूचनाओं के लिए सुनता सेट कर सकते हैं।

जब आप उन अधिसूचनाएं प्राप्त करते हैं, तो आप एक चयनकर्ता को आग लग सकते हैं जो आप चाहते हैं।

+2

के लिए भी यह एक अच्छा विचार है, लेकिन स्पॉटलाइट के साथ समस्या यह है कि सभी वॉल्यूम इसका समर्थन नहीं करते हैं (विशेष रूप से कई नेटवर्क वॉल्यूम्स) और उपयोगकर्ताओं को इसे बंद करने की आदत भी होती है। –

+0

ये अच्छे अंक हैं। बस जोर से सोच रहा हूँ। –

+0

इसके अलावा आपके पास स्पॉटलाइट में निजी मोड में वॉल्यूम्स हो सकते हैं। हालांकि मेज पर विचार रखने के लिए अच्छा लगा। थम्स अप! – eonist

1

यदि आपको kqueue (जैसा कि अन्य उत्तरों में चर्चा की गई है) का उपयोग करने की आवश्यकता है तो मैक के लिए Google टूलबॉक्स में nice Objective-C wrapper है जिसका मैंने अब तक कोई समस्या नहीं उपयोग की है।

+0

obj-c में कर्नेलक्यूज़ रैपर: https://gist.github.com/nielsbot/5155671 – eonist