2011-08-26 8 views
8

मैं किसी भी बदले गए, जोड़े गए या हटाए गए फ़ाइलों या उप-निर्देशिकाओं के लिए फ़ाइल सिस्टम को मतदान करना चाहता हूं। सभी परिवर्तनों को जल्दी से पता लगाया जाना चाहिए लेकिन मशीन पर दबाव डाले बिना। ओएस विंडोज> = Vista है, मनाया गया हिस्सा एक स्थानीय निर्देशिका है।परिवर्तनों के लिए बड़ी संख्या में फाइलों को कैसे मतदान करना चाहिए?

आमतौर पर, मैं एक FileSystemWatcher का सहारा होगा, लेकिन यह है कि एक ही स्थान (प्रमुखता से, Windows Explorer) को देखने के लिए करने की कोशिश की अन्य कार्यक्रमों के साथ समस्याओं को प्रेरित किया। साथ ही, मैंने सुना है कि स्थानीय फ़ोल्डर और बड़े बफर के साथ भी एफएसडब्ल्यू वास्तव में विश्वसनीय नहीं है।

मुख्य मुद्दा रहा है कि फ़ाइलों और निर्देशिकाओं की संख्या बहुत बड़ी हो सकती है (लगता है कि 7 अंक) है। बस हर दूसरी फाइलों के लिए एक चेक चला रहा है जो मेरी मशीन को ध्यान से प्रभावित करता है।

मेरा अगला विचार समग्र प्रभाव को कम करने के लिए प्रति सेकंड पूरे पेड़ के विभिन्न हिस्सों की जांच करना था, और संभावित रूप से एक प्रकार का ह्यूरिस्टिक जोड़ना था, जो जल्दी उत्तराधिकार में अक्सर परिवर्तित होने वाली फ़ाइलों की जांच करना था।

अगर वहाँ इस तरह की समस्या के लिए पैटर्न हैं मैं सोच रहा हूँ, या अगर किसी को भी इस स्थिति के साथ अनुभव है।

+0

क्या सभी उपफोल्डर एक ही रूट के नीचे हैं? विंडोज एक्सप्लोरर के साथ आपको किस तरह की समस्याएं थीं? यह सुनिश्चित करने के लिए एक पैटर्न है कि आप किसी भी संदेश को याद नहीं करते हैं। http://stackoverflow.com/questions/4967095/c-predict-file-system-events-on-folder-delete/4968391#4968391 – adrianm

+0

@adrianm: हाँ, वही रूट। --- एक्सप्लोरर ने अपने दृश्य को अपडेट नहीं किया जब एक निगरानी फ़ोल्डर बदल गया, मुझे लगता है क्योंकि एफएसडब्ल्यू ने अपनी घटनाओं को चुरा लिया था। – mafu

उत्तर

3

हमने सी # का उपयोग करके एक समान सुविधा लागू की है। FileSystemWatcher बड़ी निर्देशिका पेड़ों के साथ अक्षम था।

हमारे विकल्प, FSNodes, एक struct हमें द्वारा बनाई उपयोग कर रहा था, तो निम्न Windows API कॉल का उपयोग:

[StructLayout(LayoutKind.Sequential)] 
     private struct FILETIME 
    { 
     public uint dwLowDateTime; 
     public uint dwHighDateTime; 
    }; 

    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] 
     private struct WIN32_FIND_DATA 
    { 
     public FileAttributes dwFileAttributes; 
     public FILETIME ftCreationTime; 
     public FILETIME ftLastAccessTime; 
     public FILETIME ftLastWriteTime; 
     public uint nFileSizeHigh; 
     public uint nFileSizeLow; 
     public int dwReserved0; 
     public int dwReserved1; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)] 
     public string cFileName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_ALTERNATE)] 
     public string cAlternate; 
    } 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool FindClose(IntPtr hFindFile); 

    [DllImport("kernel32", CharSet=CharSet.Unicode)] 
    private static extern IntPtr FindFirstFile(
     string lpFileName, out WIN32_FIND_DATA lpFindFileData); 

    [DllImport("kernel32", CharSet=CharSet.Unicode)] 
    private static extern bool FindNextFile(
     IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData); 

क्या हम करते हैं एक स्थिर प्रसंस्करण है। हम डिस्क पर मेटाडेटा पेड़ को सहेजते हैं और संग्रहित निर्देशिका पेड़ की तुलना लोड किए गए बनाते हैं, संशोधित खोज (इसके टाइमस्टैम्प (तेज), या फ़ाइल हैश पर आधारित)। साथ ही, हम हटाए गए, जोड़े गए और स्थानांतरित किए जा सकते हैं, यहां तक ​​कि स्थानांतरित संशोधित फ़ाइलों (फ़ाइल हैश पर भी आधारित)।

इस कार्यान्वयन एक डेमॉन है कि यह प्रत्येक POLL_TIME मार डाला के साथ मिश्रित, हमारे लिए वैध था। आशा करता हूँ की ये काम करेगा।

+0

क्या आप Win32 API कॉल का उपयोग करने के तरीके के बारे में कुछ समझ सकते हैं? – Cocowalla

+0

'FindFirstFile' किसी फ़ाइल या उपनिर्देशिका के लिए एक निर्देशिका के साथ एक निर्देशिका की खोज करता है जो किसी विशिष्ट नाम से मेल खाता है (या आंशिक नाम यदि वाइल्डकार्ड का उपयोग किया जाता है)। 'FindNextFile' पिछले कॉल से 'FindFirstFile' या' FindFirstFileEx' फ़ंक्शन 'पर एक फ़ाइल खोज जारी रखता है। 'FindFirstFile' (और अन्य) फ़ंक्शंस द्वारा खोला गया एक फ़ाइल खोज संभाल बंद करता है। मैं एपीआई बेहतर करने के लिए एक Google खोज की सलाह देते हैं। –

0

* निक्स वातावरण के लिए आप https://github.com/rvoicilas/inotify-tools/wiki/ inotify का उपयोग कर सकते हैं, जिसने मेरे सीमित शोध में बहुत अच्छा काम किया। वहां एक संस्करण हो सकता है जो विंडोज़ के साथ काम करता है जिसके साथ मुझे कम अनुभव होता है ... त्वरित गुगलिंग ने मुझे जावा क्लोन के लिए प्रेरित किया जिसे jnotify http://jnotify.sourceforge.net/ कहा जाता है जिसे विंडोज़ पर काम करने के लिए विज्ञापित किया जाता है, इसलिए यह कोशिश करने लायक हो सकता है।

1

मेरे सर्वोत्तम अनुमान अगर यह एक स्थानीय मशीन है USN जर्नल का उपयोग किया जाएगा, तो आप व्यवस्थापक विशेषाधिकार और विभाजन NTFS हैं। यूएसएन पत्रिका बेहद तेज़ और भरोसेमंद है। यह एक लंबा टॉपिस है और यह लिंक सबकुछ बताता है: http://www.microsoft.com/msj/0999/journal/journal.aspx

संबंधित मुद्दे