2013-02-19 29 views
5

मेरे पास फ़ंक्शन नामक पेज_लोड में कोड है। जब विजुअल स्टूडियो शुरू करने के बाद पहली बार पृष्ठ लोड किया जाता है, तो सब ठीक काम करता है।
लेकिन उस के बाद फ़ाइल को किसी अन्य उद्घाटन कॉल IOException: "File is in use by another process" देता है, तब भी जब सीधे VisualStudio समाधान में फ़ाइल खोलने के लिए इस त्रुटि लौटा दिया जाता है (निश्चित रूप से अपवाद के रूप में नहीं)FileStream.close() अन्य प्रक्रियाओं के लिए फ़ाइल मुक्त नहीं करता है

FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open); 
PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream); 
//Do some stuff with the file 
mailinglist_FileStream.Close(); 
mailinglist_Reader.Close(); 
mailinglist_Reader.Dispose(); 
mailinglist_FileStream.Dispose(); 

क्यों फ़ाइल अभी तक बंद है? और पूरी तरह से विजुअल स्टूडियो को फिर से शुरू करने से फ़ाइल रीसेट क्यों करता है? जाँच जब फ़ाइल गुण यह कहते हैं:

बिल्ड कार्रवाई: सामग्री
कॉपी उत्पादन निर्देशिका के लिए:

मैं केवल इस फ़ाइल पढ़ रहा हूँ कॉपी नहीं है। क्या मैं adLockOptimistic से संबंधित कुछ कर सकता हूं, ताकि एकाधिक प्रक्रियाएं फ़ाइल तक पहुंच सकें?

+2

साइड नोट पर: मैन्युअल रूप से –

उत्तर

7

फ़ाइल अभी भी लॉक क्यों है? और विज़ुअल स्टूडियो को पूरी तरह से पुनरारंभ क्यों करता है स्टूडियो फ़ाइल को रीसेट करता है? फ़ाइल-गुणों की जांच करते समय यह कहता है [...] मुझे नहीं पता कि फ़ाइल अभी भी क्यों बंद है: शायद क्योंकि आपका कोड स्ट्रीम बंद/डिस्पोजेड होने से पहले विफल हो जाता है।

बारे "क्यों पूरी तरह से पुन: प्रारंभ दृश्य स्टूडियो [...]": क्योंकि आप आईआईएस एक्सप्रेस या ASP.NET देव सर्वर जिसका, बंद हो जाती हैं जब आप आईडीई बंद तो फाइलों पर ताले जारी कर रहे हैं का उपयोग कर किया जा सकता है चूंकि ताले रखने वाली प्रक्रिया अब चल रही नहीं है।

और लगभग "फ़ाइल अभी भी क्यों बंद है? [...]" ऐसा इसलिए हो सकता है क्योंकि फ़ाइल स्ट्रीम बंद नहीं होती है क्योंकि कभी-कभी थ्रेड सफलतापूर्वक समाप्त नहीं हो सकता है और ताले जारी नहीं किए जाते हैं।

के रूप में अन्य जवाब में कहा, जांच कैसे using ब्लॉक से बचने के सकता है कि IDisposable वस्तुओं निपटारा नहीं किया जाएगा:

// FileShare.ReadWrite will allow other processes 
// to read and write the target file even if other processes 
// are working with the same file 
using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open, FileShare.ReadWrite)) 
using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream)) 
{ 
     // Do your stuff. Using blocks will call Dispose() for 
     // you even if something goes wrong, as it's equal to a try/finally! 
     // Also check how using statements can be chained without extra { }   
} 

मैं केवल इस फ़ाइल पढ़ रहा हूँ। क्या मैं adLockOptimistic से कुछ ऐसा कर सकता हूं, ताकि एकाधिक प्रक्रियाएं फ़ाइल तक पहुंच सकें?

हाँ, File.Open विधि और FileShare गणन पर एक नज़र डालें उपयोग करने के लिए http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

+1

+1ShareShare enum पर – jessehouwing

+0

@ मतिस अपनी ब्रेसिज़ टिप्पणी के संबंध में: "बिना अतिरिक्त {}" भाषा वाक्यविन्यास का उपयोग करने की व्यक्तिगत प्राथमिकता है। एक एकल कथन ब्लॉक को ब्रेसिज़ संलग्न करने की आवश्यकता नहीं होती है। और FileShare.ReadWrite अन्य प्रक्रियाओं को फ़ाइल तक पहुंचने की अनुमति देगा, लेकिन यह फ़ाइल को खोलने की समस्या को हल नहीं करता है। अच्छा उदाहरण और अच्छे अंक, यद्यपि। – Suncat2000

0

using ब्लॉक का उपयोग करने का प्रयास करें, यह आपकी लॉक समस्या को ठीक नहीं कर सकता है, लेकिन यह डिस्पोजेबल वस्तुओं के लिए बेहतर रूप है।

using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open)) 
{ 
    using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream)) 
    { 
     ...    
    } 
} 

इसके अलावा, mailinglist_FileStream से पहले mailinglist_Reader बंद करके देखें।

+0

ऑब्जेक्ट को बंद करने और निपटाने के बजाए उपयोग कथन का उपयोग करें, मजाकिया बात यह है कि ऑर्डर बदलने के बाद, पेज_लोड काम करता है, लेकिन मेरा कैच (IOException) ब्लॉक अभी भी – Vogel612

+1

'स्ट्रीम' कॉल का कॉल निष्पादित हो जाता है। 'ब्लॉक का उपयोग करने में अनावश्यक है। –

+0

आपको क्या अपवाद मिल रहा है, वही? दो 'बंद();' लाइनों पर टिप्पणी करने का प्रयास करें क्योंकि उन्हें शायद 'उपयोग' द्वारा बुलाया जाता है। –

1

जानें using:

using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read)) 
{ 
    ... 
} 

using निर्माण सुनिश्चित करता है कि जब आप एक अपवाद फेंक दिया जाता है तो भी ब्लॉक बंद होने पर फ़ाइल बंद हो जाएगी।

आपकी समस्या यहां नहीं हो सकती है, लेकिन आपके कोड में कहीं और। आपको अपने सभी कोड से गुज़रना होगा और उन स्थानों की तलाश करनी होगी जहां आपने फाइलें खोली हैं लेकिन इसे using कथन के अंदर नहीं रखा है।

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

  • कोई संबंधित समस्या नहीं^_^