2011-11-21 6 views
5

मुझे फाइल सिस्टम सिस्टम के साथ काम करने में कोई समस्या है, यह मुझे पागल कर रहा है।.NET का FileSystemWatcher जब कोई अपवाद उठाया जाता है तो क्रैश हो जाता है, फेंक फ़ाइल भविष्य की फ़ाइलों के लिए उपयोग में है

बाहर कर देता है मैं एक फ़ोल्डर, में नए पाठ फ़ाइलों के लिए देख रहा हूँ जब बनाया इवेंट उठाया है, मैं मूल रूप से यह निम्नलिखित कोड का उपयोग कर पढ़ें:

string txtTemp = File.ReadAllText(MyFilePath); 

उसके बाद, मैं में डेटा की प्रक्रिया txtTemp स्ट्रिंग, मूल रूप से मैंने इसे & डेटा को डीबी पर संग्रहीत किया है, यह बहुत आसान है?

समस्या

है जब एक अपवाद इस प्रक्रिया (मान लीजिए कि डाटाबेस कनेक्शन विफल है) अगर मैं इसे पकड़ने, यह कोई बात नहीं में उठाया है, क्योंकि अगले आने वाले फ़ाइलों के लिए एप्लिकेशन एक अपवाद

कह फेंक होगा

"प्रक्रिया'NewComingFile.txt 'फ़ाइल तक नहीं पहुंच सकती है क्योंकि यह किसी अन्य प्रक्रिया द्वारा उपयोग की जा रही है।"

नई बनाई गई फ़ाइल का उपयोग कैसे किया जा सकता है अगर इसे खोला या पढ़ा नहीं गया है? और एप्लिकेशन सभी नई फ़ाइलों के लिए "प्रक्रिया को एक्सेस नहीं कर सकता" अपवाद को फेंकता रहता है।

केवल एक चीज हम कर सकते हैं, को बंद करने और आवेदन को फिर से खोलने के लिए है इस एप्लिकेशन को रीसेट करता है और सब कुछ फिर से ठीक काम करता है किसी भी प्रकार की कोई अपवाद जब तक फिर से उठाया है> (भगवान!)

कोई भी विचार? कोई कामकाज? कोई विचार? कोई सुझाव ... कोई भी? hehehehe =)

धन्यवाद दोस्तों !!

+0

क्या यह संभव है कि आप अपवाद के मामले में एक और फ़ाइलसिस्टम वाटर स्थापित कर रहे हों, और वे दोनों एक ही फाइल को संभालने के लिए दौड़ रहे हैं? क्या आप अपना इवेंट हैंडलिंग कोड पोस्ट कर सकते हैं, साथ ही FileSystemWatcher सेटअप कोड भी पोस्ट कर सकते हैं? – zmbq

+0

अधिक कोड उपयोगी होगा – jtm001

+0

['File.ReadAllText()'] (http://msdn.microsoft.com/en-us/library/ms143368.aspx): "एक टेक्स्ट फ़ाइल खोलता है, फ़ाइल की सभी पंक्तियां पढ़ता है , ** और फिर फ़ाइल ** बंद कर देता है। "। ऐसा तब तक नहीं होना चाहिए जब तक अपवाद नहीं उठाया जाता है। क्या आप फ़ाइल पढ़ने के लिए StreamReader को आजमा सकते हैं? – CodeCaster

उत्तर

5

आप Sysinternals Process Explorer का उपयोग करके अपनी जांच शुरू कर सकते हैं। यह आपको अधिक जानकारी देगा, विशेष रूप से जिस प्रक्रिया में फ़ाइल है।

+0

यह जवाब नहीं था लेकिन यह इतना उपयोगी था यह अच्छा है :- डी –

-1

एक कार्य-आसपास सरल है - अपने वॉचर को अपने ऐपडोमेन में रखें, ऐपडोमेन को फाड़ें और अगर आप अपवाद को संभालें तो पुनरारंभ करें। यह शायद आपकी समस्या को ठीक करेगा। लेकिन ऐसा क्यों होता है? मुझे इसके बारे में थोड़ा सोचना होगा, और शायद कुछ मिल जाएगा।

+3

जब हमारी नाव डूब जाती है तो चलो हमारी नाव में नाव डाल दें। और क्या होगा यदि दूसरी नाव डूब जाए? एक और नाव में रखो! – CodeCaster

+0

हाहाहा हाँ सही दोस्त! –

+0

उन्हें लाइफबोट कहा जाता है। जहाज के डूबने पर हर जहाज में उन्हें होता है। वैसे भी ... यदि FileSystemWatcher गंभीर रूप से त्रुटिपूर्ण है, तो यह सुझाव एक वैध विकल्प हो सकता है। ऐसा कहकर, अलगाव शायद अनावश्यक है, क्योंकि समस्या बस एक खुली फ़ाइल हैंडल है। – Triynko

2

फ़ाइल पूरी तरह से लिखी जाने से पहले बनाई गई घटना को निकाल दिया गया है।

MSDN से:

OnCreated घटना जैसे ही एक फ़ाइल बनाई गई है उठाया है। यदि फ़ाइल की प्रतिलिपि बनाई गई है या किसी देखे गए निर्देशिका में स्थानांतरित की जा रही है, तो ऑनक्रेटेड ईवेंट तुरंत उठाया जाएगा, इसके बाद एक या अधिक ऑन चेंज ईवेंट होंगे।

तो आपके द्वारा वर्णित अपवाद प्राप्त करना काफी सामान्य होगा। जब मुझे इस स्थिति का सामना करना पड़ता है, तो मैं मूल रूप से यह देखने के लिए फ़ाइल का परीक्षण करता हूं कि मैं इसे एक्सेस कर सकता हूं या नहीं। यहां मैं उपयोग किया गया फ़ंक्शन है:

private static bool GetExclusiveAccess(string filePath) 
    { 
    try 
    { 
     using (FileStream file = new FileStream(filePath, FileMode.Append, FileAccess.Write)) 
     { 
      file.Close(); 
      return true; 
     } 
    } 
    catch (IOException) 
    { 
     return false; 
    } 
    } 

यदि आपके पास पहुंच नहीं है, तो आपको प्रतीक्षा करने और फिर से जांच करने की आवश्यकता होगी।

+0

नहीं, मैं फ़ाइल का मुकाबला नहीं कर रहा हूं, यह एक अलग ऐप से बनाया गया है, लेकिन मान लें कि यह समस्या थी, अगर मैं अपवाद के बाद इसे पुनरारंभ करता हूं तो यह ठीक काम करता है? –

+0

फ़ाइल को कॉपी करने के साथ इसे करने की ज़रूरत नहीं है। अस्तित्व में आने वाली किसी भी फ़ाइल को पहले बनाया जाना चाहिए और फिर यह सामग्री के साथ "भर गया" है और फिर बंद हो गया है। "भरने" के दौरान यह फ़ाइल निर्माता द्वारा बंद कर दिया गया है। लेकिन FileSystemWatcher सृजन के बाद सही ढंग से ऑनक्रेटेड ईवेंट को निकाल देता है। तो आपके पास फ़ाइल के निर्माता और ऑनक्रेटेड ईवेंट का जवाब देने वाला कोड के बीच दौड़ की स्थिति है। यदि यह एक सुपर छोटी फ़ाइल है, तो आपके थ्रेड को ऑनक्रेटेड होने पर भरना हो सकता है। लेकिन आम तौर पर आप देखेंगे कि आपने क्या वर्णन किया है। फ़ाइल निर्माता अभी भी इसे "भर रहा है"। –

+0

धन्यवाद रसेल मैकक्लर, मैं आज इसका परीक्षण करूँगा और अपना समाधान लागू करने का प्रयास करूंगा, फिर आपको बता दूंगा। एक बार फिर धन्यवाद ! –

2

फ़ाइल खोलने का कार्य अंतिम बार पढ़ने वाला टाइमस्टैम्प बदल सकता है: इससे लूप हो सकता है।

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

[मैंने अतीत में FileSystemWatcher के साथ कुछ बहुत ही रोचक कोने के मामलों को देखा है - यह एक जानवर का थोड़ा सा हो सकता है जब कॉर्नर्ड किया जाता है। एक (थोड़ी देर पहले) विंडोज सर्वर 2003 में एक गैर-पुन: उत्पादित नीली स्क्रीन लटका हुआ था जब एक आंतरिक बफर बह गया क्योंकि यह घटनाओं के साथ घिरा हुआ था। सबसे सावधान रहें।]

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