2009-11-20 16 views
26

में फ़ाइल-स्तरीय फाइल सिस्टम अधिसूचना बदलना चाहता है, मैं चाहता हूं कि मेरे कोड को अधिसूचित किया जाए जब किसी भी फ़ाइल को (या तो प्रत्यक्ष या परोक्ष रूप से) किसी दिए गए निर्देशिका में संशोधित किया गया हो। "संशोधित" से, मेरा मतलब है कि जब भी कोई फ़ाइल की सामग्री बदल जाती है, तो मेरा कोड अधिसूचित होना चाहता है, इसका नाम बदल दिया गया है, या इसे हटा दिया गया है; या अगर कोई नई फाइल जोड़ दी गई है। मेरे आवेदन के लिए, हजारों फाइलें हो सकती हैं।मैक ओएस एक्स

मैं FSEvents के रूप में देखा है, लेकिन इसकी प्रौद्योगिकी सिंहावलोकन कहते हैं, भाग में:

दूर ले करने के लिए महत्वपूर्ण बात यह है कि सूचनाओं के विवरण के स्तर को एक निर्देशिका के स्तर पर है। यह आपको केवल इतना बताता है कि निर्देशिका में कुछ बदल गया है, लेकिन आपको यह नहीं बताता कि क्या बदल गया है।

यह भी कहते हैं:

फाइल सिस्टम घटनाओं एपीआई भी जब किसी विशेष फ़ाइल परिवर्तन जानने के लिए नहीं बनाया गया है। ऐसे उद्देश्यों के लिए, Kqueues तंत्र अधिक उपयुक्त है।

हालांकि, किसी दिए गए फ़ाइल पर kqueue का उपयोग करने के लिए, फ़ाइल फ़ाइल डिस्क्रिप्टर प्राप्त करने के लिए फ़ाइल को खोलना होगा। हजारों फ़ाइल डिस्क्रिप्टरों को प्रबंधित करने के लिए यह अव्यवहारिक है (और संभवतः ओपन फाइल डिस्क्रिप्टर की अधिकतम स्वीकार्य संख्या से अधिक हो जाएगा)।

उत्सुकता से, विंडोज के तहत, मैं ReadDirectoryChangesW() फ़ंक्शन का उपयोग कर सकता हूं और यह वही है जो मैं चाहता हूं।

तो मैक ओएस एक्स के तहत मैं क्या कर सकता हूं? या, एक और तरीका पूछा: उपयोगकर्ता-स्पेस में मैक ओएस एक्स के लिए ReadDirectoryChangesW() के बराबर लिखने के बारे में कोई कैसे होगा (और बहुत कुशलता से ऐसा करें)?

उत्तर

6

मैं इस अपने आप को प्रयास नहीं किया है, लेकिन ऐसा लगता FSEvents तरह 10.7 (Lion) के रूप में फ़ाइल-स्तर सूचनाएं प्रदान करने में सक्षम है। the description of FSEventStreamCreateFlags से:

kFSEventStreamCreateFlagFileEvents

अनुरोध फ़ाइल स्तर सूचनाएं। आपकी स्ट्रीम केवल पदानुक्रम में अलग-अलग फ़ाइलों के बारे में ईवेंट प्राप्त करेगी जो आप केवल निर्देशिका स्तर अधिसूचनाएं प्राप्त करने के बजाय देख रहे हैं।इस ध्वज को देखभाल के साथ प्रयोग करें क्योंकि इससे इसके बिना महत्वपूर्ण घटनाएं उत्पन्न होंगी।

ओएस एक्स v10.7 और बाद में उपलब्ध है।

8

संपादित करें: सत्यापित नहीं है, लेकिन Konstantin नीचे है कि इस कोड का नमूना 2012

मैं वहाँ आप जो खोज रहे हैं के लिए एक विशिष्ट एपीआई है पर विश्वास नहीं करते के रूप में अप्रचलित है इंगित करता है। ऐप्पल Watcher नामक एक समान समस्या के लिए नमूना कोड प्रदान करता है। यह वह नहीं है जिसे आप ढूंढ रहे हैं, लेकिन इस बिंदु पर आप सबसे अच्छा कर सकते हैं। आपको निर्देशिका के स्नैपशॉट्स लेना होगा, और जब आप कुछ बदल जाएंगे तो इसे पुन: स्कैन करें। यदि आप संशोधन समय पर भरोसा कर सकते हैं, तो पाठ्यक्रम की जांच करने के लिए संशोधन समय सबसे अच्छी बात है।

आप शायद सही हैं कि एक असंबद्ध संख्या के लिए पंजीकरण करने का प्रयास करना संभव नहीं होगा।

+0

मैं आमतौर पर विंडोज प्रोग्रामिंग को नापसंद करता हूं और मैक/लिनक्स प्रोग्रामिंग को बहुत पसंद करता हूं। यह सिर्फ विचित्र लगता है कि विंडोज़ में कम से कम 1 चीज करना आसान है। –

+3

ओह, विंडोज़ पर कई चीजें करना आसान है। कोको का उपयोग करके SOAP से बात करने का प्रयास करें। एनएसएआरएआरई अच्छा है, लेकिन कभी-कभी सी # -स्टाइल जेनेरिक का स्वागत है। मैक के पास एएसपी.नेट के करीब कुछ भी नहीं है (मैं आपको देख रहा हूं, वेब ऑब्जेक्ट्स)। मुझे कोको पसंद है; यह अब तक का सबसे अच्छा ढांचा है जिसे मैंने कभी सामना किया है। लेकिन कोई भी जो सोचता है कि विंडोज़ की तुलना में मैक पर डेवलपर्स के लिए सब कुछ बेहतर है, दोनों पर बहुत ज्यादा विकसित नहीं हुआ है। इस तरह की चीजों के लिए, हम सभी जेएफएस के उस पवित्र अंगूर की प्रतीक्षा कर रहे हैं, जो इस तरह की चीजें आसान और तेज़ कर सकता है। किसी दिन ... (माइक्रोसॉफ्ट के पास Winfs के सपने भी हैं ...) –

+1

समस्या यह है कि आप मैक प्रोग्रामिंग के साथ लिनक्स प्रोग्रामिंग को घुमा रहे हैं। लिनक्स पर इनोटिफाइवेट के साथ करना बहुत आसान है। – MarkovCh1

-2

आप man fs_usage देख सकते हैं, हालांकि यह निर्देशिका के लिए विशिष्ट नहीं है और रूट विशेषाधिकारों की आवश्यकता है।

2

मैक ओएस एक्स पर आपकी आवश्यकताओं से मेल खाने वाली निकटतम उपयोगिता (जो मुझे पता है) fslogger है। विवरण, डीएमजी और स्रोत कोड के लिए लिंक देखें: OSXBook - fslogger