2009-12-07 15 views
41

क्या ऐसा करने का कोई तरीका है:क्या आप अंतर्निहित धारा का निपटान करने से StreamReader रख सकते हैं?

this.logFile = File.Open("what_r_u_doing.log", FileMode.OpenOrCreate, FileAccess.ReadWrite); 

using(var sr = new StreamReader(this.logFile)) 
{ 
    // Read the data in 
} 

// ... later on in the class ... 

this.logFile = File.Open("what_r_u_doing.log", FileMode.OpenOrCreate, FileAccess.ReadWrite); 

using(var sw = new StreamWriter(this.logFile)) 
{ 
    // Write additional data out... 
} 

फ़ाइल को दो बार खोलने के बिना?

मैं StreamReader को मेरी स्ट्रीम का निपटान नहीं कर सकता। मैं इसे सिर्फ दायरे से बाहर जाने नहीं देना चाहता हूं। फिर कचरा कलेक्टर अंततः निपटान को बुलाएगा, धारा को मार देगा।

उत्तर

41

मैं इसे सिर्फ दायरे से बाहर जाने नहीं देना चाहता हूं। फिर कचरा कलेक्टर अंततः निपटान को बुलाएगा, धारा को मार देगा।

कचरा कलेक्टर Finalize विधि (नाशक) फोन करेगा, नहीं Dispose विधि। फाइनलर Dispose(false) पर कॉल करेगा जो अंतर्निहित धारा का निपटान नहीं करेगा। StreamReader दायरे से बाहर निकलने के बाद आपको ठीक होना चाहिए यदि आपको सीधे अंतर्निहित धारा का उपयोग करने की आवश्यकता है। बस यह सुनिश्चित करें कि जब आप उपयुक्त हों तो अंतर्निहित स्ट्रीम को मैन्युअल रूप से निपटें।

0

इसे अपने आप के साथ किए जाने पर try/finally खंड में बंद करें।

var sr = new StreamReader(); 
try { 
    //...code that uses sr 
    //....etc 
} 
finally 
{ 
    sr.Close(); 
} 
2

बस उपयोग-ब्लॉक को हटा दें। यदि आप ऐसा नहीं करना चाहते हैं, तो स्ट्रीम स्ट्रीमर को निपटाने की जरूरत नहीं है() स्ट्रीमरिएडर।

+3

लेकिन वहाँ संभावना नहीं है कि भविष्य में 'StreamReader', कुछ nonmanaged संसाधन पकड़ एक finalizer को लागू करने शुरू करते हैं, और उसके बाद जब दायरे से बाहर जा रहा है बेतरतीब ढंग से अपनी स्ट्रीम बंद संशोधित किया जाएगा जब कचरा कलेक्टर इसे अंतिम रूप देता है?या क्या हम मानते हैं कि * ऐसा माना जाता है, क्योंकि यह अब नहीं होगा, यह कभी नहीं होगा? – binki

15

आप जॉन स्कीट के MiscUtil library से NonClosingStreamWrapper वर्ग इस्तेमाल कर सकते हैं, यह वास्तव में उस उद्देश्य

3

आप एक नया वर्ग जो StreamReader से विरासत बना सकते हैं और बंद विधि रद्द कर सकते थे कार्य करता है; अपनी बंद विधि के अंदर, कॉल करें (झूठा), जिसे मेहर्डद ने इंगित किया है, धारा बंद नहीं करता है। निश्चित रूप से स्ट्रीमवाइटर पर भी लागू होता है।

हालांकि, ऐसा लगता है कि एक बेहतर समाधान स्ट्रीम स्ट्रीमर और स्ट्रीमवाइटर उदाहरणों पर तब तक पकड़ना होगा जब तक आपको उनकी आवश्यकता हो। यदि आप पहले ही स्ट्रीम को खोलने की योजना बना रहे हैं, तो आप स्ट्रीमर और स्ट्रीमवाइटर को भी खोल सकते हैं। यदि आप StreamWriter.Flush और Stream.Seek का उपयोग करते हैं, तो आप इसे पढ़ने और लिखने के दौरान भी यह काम करने में सक्षम होना चाहिए।

59

.NET 4.5 अंत में है कि एक leaveOpen पैरामीटर StreamReader और StreamWriter पर एक नया कंस्ट्रक्टर्स के साथ इस समस्या का समाधान हो:

StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen) 

StreamWriter(Stream stream, System.Text.Encoding encoding, int bufferSize, bool leaveOpen) 
+16

इस समस्या में यह है कि यह मुझे यह समझने के लिए मजबूर करता है कि StreamReader को उसी तरह व्यवहार करने के लिए क्या एन्कोडिंग करना है जैसा मैंने इसे 'StreamReader (स्ट्रीम)' कन्स्ट्रक्टर का उपयोग करके खोला था। तो मैं अभी भी "निपटान न करें और आशा करता हूं कि मेरे किसी भी सहयोगी 'सही' विधि को स्ट्रीमरडर को एक प्रयोग ब्लॉक में डालने का तरीका नहीं है" दृष्टिकोण :( – phoog

+12

@phoog: (मेरे इनबॉक्स पर पकड़ना) - एमएसडीएन को डिफ़ॉल्ट सूची चाहिए फॉरवर्डिंग-स्टाइल ओवरलोड के लिए, उदाहरण के लिए 'स्ट्रीम रीडर (स्ट्रीम)' कहता है "यह कन्स्ट्रक्टर यूटीएफ 8 एन्कोडिंग, स्ट्रीम पैरामीटर का उपयोग कर बेसस्ट्रीम प्रॉपर्टी और आंतरिक बफर आकार 1024 बाइट्स तक एन्कोडिंग शुरू करता है।" –

+4

@ सिमन बुचन लेकिन मुझे नहीं करना चाहिए मेरे प्रोग्राम में इन डिफ़ॉल्टों को हार्डकोड करना होगा। 'StreamReader() 'कन्स्ट्रक्टर को विकल्प-शैली वर्ग पैरामीटर लेने के लिए बदला जाना चाहिए था, जैसे' XmlReaderSettings' कैसे काम करता है। फिर डिफ़ॉल्ट को ढांचे और नए पैरामीटर में प्रबंधित किया जा सकता है एक गैर-एबीआई-ब्रेकिंग और गैर-हार्डबेक तरीका। – binki

1

उपयोग एक और निर्माता अधिभार जहाँ आप एक "leaveOpen" पैरामीटर specifu कर सकते हैं करने के लिए "सही"

0

मैं हमेशा कुछ इस तरह का उपयोग करें:

public static class StreamreaderExtensions 
{ 
    public static StreamReader WrapInNonClosingStreamReader(this Stream file) => new StreamReader(file, Encoding.UTF8, true, 1024, true); 
} 
(यह भी leaveOpen तर्क का उपयोग करता है)

उपयोग:

using (var reader = file.WrapInNonClosingStreamReader()) 
{ 
    .... 
} 
संबंधित मुद्दे