2011-10-11 17 views
7

में निर्देशिका की निगरानी करना मैं परिवर्तनों के लिए निर्देशिका की सामग्री की निगरानी करने का एक तरीका ढूंढ रहा हूं। मैंने दो दृष्टिकोणों की कोशिश की है।कोको/कोको टच

  1. उपयोग kqueue निर्देशिका
  2. उपयोग GCD नजर रखने के लिए निर्देशिका

नजर रखने के लिए समस्या मैं का सामना कर रहा हूँ कि मैं पता लगाने के लिए जो फ़ाइल बदल गया है एक तरह से नहीं मिल सकती है। मैं संभावित रूप से हजारों फाइलों के साथ एक निर्देशिका की निगरानी करने का प्रयास कर रहा हूं और मैं यह पता लगाने के लिए कि उनमें से प्रत्येक पर स्टेटस को कॉल करना नहीं चाहता हूं। मैं उस निर्देशिका में प्रत्येक फ़ाइल के लिए एक अलग प्रेषण स्रोत भी स्थापित नहीं करना चाहता हूं। क्या यह वर्तमान में संभव है?

नोट: मैं के साथ kqueue और GCD

+0

क्या आप मैक ओएस एक्स और आईओएस दोनों को लक्षित कर रहे हैं? –

+0

मैं ओएस एक्स को लक्षित कर रहा हूं लेकिन मुझे यह भी रुचि थी कि यह आईओएस पर काम करेगी। – DHamrick

उत्तर

4

मेरी सलाह सिर्फ गोली काटने और एक अन्य सूत्र में एक निर्देशिका स्कैन करना है अपने प्रयोगों निगरानी फ़ाइलों दर्ज किया है, तो आप फ़ाइलों के हजारों के बारे में बात कर रहे हैं, भले ही। लेकिन अगर आप जोर देते हैं, तो यहां जवाब है:

अपनी आस्तीन को घुमाने और कर्नेल डाइविंग जाने के बिना ऐसा करने का कोई तरीका नहीं है।

आपका पहला विकल्प FSEvents ढांचे का उपयोग करना है, जो फाइल बनाई, संपादित या हटाए जाने पर अधिसूचनाएं भेजती है (साथ ही विशेषताओं के साथ काम करने के लिए)। अवलोकन here है, और किसी ने एपीआई के आसपास Objective C wrapper लिखा है, हालांकि मैंने इसे आजमाया नहीं है। लेकिन सिंहावलोकन फ़ाइल परिवर्तनों के आसपास की घटनाओं के बारे में हिस्सा का उल्लेख नहीं करता है, केवल निर्देशिकाएं (जैसे kqueue)। मैं अपने स्वयं के लॉगर को संकलित करने के लिए हेडर फ़ाइल here के साथ here से कोड का उपयोग कर समाप्त हुआ जिसका उपयोग मैं व्यक्तिगत फ़ाइल स्तर पर ईवेंट प्राप्त करने के लिए कर सकता था। पृष्ठभूमि में लॉगर चलाने और इसे मॉनिटर करने के लिए आपको अपने ऐप में कुछ कोड लिखना होगा।

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

चीजों को और अधिक मज़ेदार बनाने के लिए, आपके FSEvents लॉगर और fs_usage दोनों रूट पहुंच की आवश्यकता है, इसलिए आपको अपने ओएस एक्स ऐप में उपयोग करने से पहले उपयोगकर्ता से प्रमाणीकरण प्राप्त करना होगा (Authorization Services Programming Guide को कैसे देखें इसे करने के लिए)।

यदि यह सब बहुत जटिल लगता है, ऐसा इसलिए है क्योंकि यह है। लेकिन कम से कम आपको कठिन तरीके से पता नहीं था!

+3

आईओएस पर FSEvents उपलब्ध है? क्या एक आईओएस प्रोग्राम fs_usage जैसे मनमाने ढंग से कमांड चला सकता है? –

+0

आईओएस के लिए, FSEvents की वास्तव में आवश्यकता नहीं होगी - चूंकि सभी ऐप्स सैंडबॉक्स किए गए हैं, इसलिए कोई भी फ़ाइल सिस्टम ईवेंट नहीं है जिसे आप दस्तावेज़ फ़ोल्डर में फ़ाइलों के साथ काम करके स्वयं नहीं बनाते हैं। मैंने आईओएस 5 के बारे में नोट्स देखे हैं जो इंगित करते हैं कि आप iCloud फाइल सिस्टम पर FSEvents का उपयोग करने में सक्षम होंगे।यदि आप * जेलब्रोकन * फोन (फुसफुसाहट) के बारे में बात कर रहे हैं, तो यह संभव है कि FSEvents को भेजा जा सके, लेकिन एक त्वरित Google खोज अनिश्चित थी। मुझे संदेह है कि उनके पास एक उपकरण है जैसे fs_usage बनाया गया है, लेकिन आप स्वयं को संकलित कर सकते हैं ... – sgress454