2013-02-22 16 views
59

मैं किसी निर्देशिका की निगरानी करने के लिए Windows प्रपत्र अनुप्रयोग का उपयोग कर रहा हूं और फ़ाइलों को किसी अन्य निर्देशिका में छोड़ देता हूं।निर्देशिका की निगरानी करने के लिए FileSystemWatcher का उपयोग

फिलहाल यह फ़ाइल को दूसरी निर्देशिका में कॉपी करेगा, लेकिन जब कोई अन्य फ़ाइल जोड़ दी जाएगी तो यह केवल कोई त्रुटि संदेश समाप्त नहीं होगा। कभी-कभी यह तीसरे स्थान पर समाप्त होने से पहले दो फाइलों की प्रतिलिपि बनाता है।

ऐसा इसलिए है क्योंकि मैं एक कंसोल ऐप की बजाय विंडोज फॉर्म एप्लिकेशन का उपयोग कर रहा हूं? क्या कोई तरीका है कि मैं प्रोग्राम को समाप्त होने और निर्देशिका को देखने के लिए रोक सकता हूं?

private void watch() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
         | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 

private void OnChanged(object source, FileSystemEventArgs e) 
{ 
    //Copies file to another directory. 
} 

उत्तर

85

समस्या फ़िल्टर को सूचित किया गया था। कार्यक्रम एक फाइल खोलने की कोशिश कर रहा था जो अभी भी कॉपी कर रहा था। मैंने LastWrite को छोड़कर सभी अधिसूचना फ़िल्टर हटा दिए।

private void watch() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastWrite; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 
20

आप फ़ाइल कोड से निपटने की आपूर्ति नहीं था, लेकिन मैं आपके द्वारा किए गए मान वही गलती हर किसी को जब पहली ऐसी बात लिख करता है: filewatcher घटना जैसे ही फ़ाइल बनाई गई है बढ़ा दी जाएगी। हालांकि, फ़ाइल को समाप्त होने में कुछ समय लगेगा। उदाहरण के लिए 1 जीबी का फ़ाइल आकार लें। फ़ाइल किसी अन्य प्रोग्राम द्वारा बनाई जा सकती है (Explorer.exe इसे कहीं से कॉपी कर रहा है) लेकिन उस प्रक्रिया को समाप्त करने में कुछ मिनट लगेंगे। घटना निर्माण समय पर उठाई गई है और आपको प्रतिलिपि बनाने के लिए फ़ाइल तैयार होने की प्रतीक्षा करनी होगी।

आप एक लूप में this फ़ंक्शन का उपयोग करके फ़ाइल तैयार होने की प्रतीक्षा कर सकते हैं।

14

कारण यह हो सकता है कि वॉचर को स्थानीय चर के रूप में घोषित किया गया हो और विधि समाप्त होने पर कचरा इकट्ठा किया जाता है। आपको इसे कक्षा के सदस्य के रूप में घोषित करना चाहिए। निम्न का प्रयास करें:

FileSystemWatcher watcher; 

private void watch() 
{ 
    watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
         | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 

private void OnChanged(object source, FileSystemEventArgs e) 
{ 
    //Copies file to another directory. 
} 
+9

'वॉचर 'चर को जीवित रखा जाता है (कचरा नहीं एकत्र किया जाता है) क्योंकि उसने बदली हुई घटना की सदस्यता ली है। – adospace

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