2011-09-09 14 views
22

संभव डुप्लिकेट बंद कर देता है प्रतीक्षा करने के लिए:
Wait until file is unlocked in .NETअच्छा और साफ रास्ता जब तक फ़ाइल

मैं एक .doc या .txt की तरह, एक खुली फ़ाइल है, और मैं इंतजार करना जब तक कि उपयोगकर्ता इसे बंद न करे। मैं पहले से ही इस कोशिश, Wait until file is unlocked in .NET के अनुसार:

while (true) 
{ 
    try 
    { 
     using (FileStream Fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None, 100)) 
     { 
      //the file is close 
      break; 
     } 
    } 
    catch (IOException) 
    { 
     //wait and retry 
     Thread.Sleep(1000); 
    } 
} 

यह अच्छी तरह से काम करता है, लेकिन यह आज़माएं/कैच के बिना एक समाधान खोजने के लिए और अपवाद संचालक संभव हो सकता है?

+3

यह एक बहुत अच्छा सवाल है। – TIHan

+0

दुर्भाग्यवश, आप सामान्य रूप से नहीं कर सकते हैं। – SLaks

+4

इसके लिए पहले से ही एक प्रश्न है - आपने एक लिंक भी पोस्ट किया है - तो अगर यह जवाब है, तो यह जवाब है। यह वास्तव में बहुत बुरा है, हालांकि, एक साफ तरीका नहीं है। – Ryan

उत्तर

8

दुर्भाग्य से नहीं, कोई दूसरा रास्ता नहीं है।

एपीआई में ऐसी कोई घटना नहीं है जो अनलॉक या किसी और चीज के सुविधाजनक होने पर आग लग जाएगी।

प्रतीक्षा के साथ पुनः प्रयास करना वर्तमान एपीआई के साथ सबसे अच्छा समाधान है।

+0

भले ही आप बिल्कुल सही हो, फिर भी मुझे आश्चर्य है कि कैसे मार्क रसेलिनोविच की प्रक्रिया एक्सप्लोरर प्रक्रिया को 'वास्तविक समय में लगभग खुले हैंडल प्रदर्शित करने का प्रबंधन करती है। क्या यह लगातार मतदान द्वारा भी करता है? मैं इसे समझने की कोशिश करूंगा, और यदि मुझे कुछ उपयोगी लगता है तो मैं अपना जवाब यहां पोस्ट करूंगा। –

+0

@ इगोर - वह प्रबंधित कोड का उपयोग नहीं कर रहा है। मुझे नहीं पता कि विंडोज एपीआई क्या खुलासा करता है (और वह _undocumented_ सुविधाओं का उपयोग कर रहा है)। – Oded

+2

निश्चित मार्क निम्न-स्तरीय अप्रबंधित API का उपयोग कर रहा है (या यहां तक ​​कि गतिशील रूप से कर्नेल ड्राइवर लोड करता है!), लेकिन ओपी यह नहीं कहता कि समस्या केवल प्रबंधित एपीआई का उपयोग करके हल की जानी चाहिए। यह मेरे लिए वास्तव में दिलचस्प है (और कई अन्य लोगों के लिए भी, मैं शर्त लगाता हूं) प्रतीक्षा-और-लूप दृष्टिकोण के बिना इसे कैसे किया जाए। –

2

एक के लिए, अभी आपके पास लूप का उपयोग न करें, break आईएनजी अगर कोई अपवाद नहीं है - using लूप में अपनी वास्तविक फ़ाइल पहुंच निष्पादित करें।

इसके बाद, यदि फ़ाइल एक ज्ञात प्रक्रिया में खुला है, तो आप अपने Process वस्तु, true को EnableRaisingEvents सेट मिलता है, और फिर से कोशिश करने के लिए अपने Exited घटना को संभाल सकता। यह असफल नहीं है, हालांकि, आप अभी भी अपवादों को संभालेंगे और एक लूप का उपयोग करेंगे।

0

आप देशी CreateFile फ़ंक्शन पर पी/इनवॉक कॉल कर सकते हैं और फिर त्रुटि कोड का विश्लेषण कर सकते हैं। हालांकि, कोशिश/पकड़ अभी भी जरूरी होगा।

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