2010-01-21 27 views
11

मैं एक स्ट्रीम खोलता हूं और फिर स्ट्रीम में डेटा को deserialize। हालांकि, मैंने सहेजे गए EventSet ऑब्जेक्ट में एक सदस्य जोड़ा है, इसलिए जब मैं पुरानी फ़ाइल खोलने का प्रयास करता हूं, तो यह deserialization लाइन पर अपवाद फेंकता है।अपवाद के बाद एक स्ट्रीम बंद करना

यह मेरे साथ ठीक है (अभी के लिए) लेकिन समस्या यह है कि मैं अपवाद को संभालता हूं, लेकिन स्ट्रीम को कभी बंद नहीं करता (क्योंकि स्ट्रीम को बंद करने से पहले अपवाद हुआ), इसलिए जब मैं फ़ाइल को फिर से खोलने का प्रयास करता हूं, यह मुझे नहीं जाने देगा क्योंकि यह उपयोग में है।

इस अपवाद के बाद मैं स्ट्रीम को कैसे बंद करूं? अगर मैं स्ट्रीम डालता हूं। अंत में या तो अंत में बंद करें(), यह एक असाइन किए गए स्थानीय चर का उपयोग करने की कोशिश करने के बारे में शिकायत करता है। मुझे लगता है कि एक यादृच्छिक फ़ाइल खोलने के लिए बुरी आदत की तरह लगता है। क्या एक स्ट्रीम को एक ऐसे तरीके से खोलने का कोई तरीका है जो खाली कन्स्ट्रक्टर के समान होगा, ऐसा लगता है कि यह असाइन किया गया है?

धन्यवाद अशक्त करने के लिए

SavedEventSet sES; 
OpenFileDialog oFD = new OpenFileDialog(); 
Stream stream; 
BinaryFormatter bF; 

try 
{ 
    oFD.InitialDirectory = this.path; 
    oFD.Title = "Open Event Saved File."; 
    oFD.ShowDialog(); 

    if(oFD.FileName.Contains(".sav")) 
    { 
     stream = File.Open(oFD.FileName, FileMode.Open); 
     bF = new BinaryFormatter(); 

     sES = (SavedEventSet)bF.Deserialize(stream); 
     stream.Close(); 

    } 
} 
catch (Exception ex) 
{ 
    stream.Close(); 
    /*handle Exception*/ 
} 

उत्तर

26

आप एक using ब्लॉक, जो स्वत: धारा बंद हो जाएगा, एक अपवाद नहीं है, भले ही उपयोग कर सकते हैं:

using(Stream stream = File.Open(oFD.FileName, FileMode.Open)) 
{ 
    bF = new BinaryFormatter(); 

    sES = (SavedEventSet)bF.Deserialize(stream); 
} 
+0

+1। उन दृश्यों के पीछे जो इसे एक कोशिश/पकड़ ब्लॉक में संकलित करते हैं, और गारंटी 'डिस्प्ले()' कहा जाता है - इसका उपयोग 'आईडीस्पोजेबल ' – STW

+0

के सभी कार्यान्वयनकर्ताओं पर किया जा सकता है, मैं सहमत हूं, यह वही है जो' उपयोग 'ब्लॉक के लिए है । – auujay

+0

धन्यवाद :) मुझे उपयोग ब्लॉक के बारे में भी पता नहीं था। – EatATaco

6

सेट धारा कोशिश ब्लॉक से पहले।

आपकी पकड़ में जांच करें कि स्ट्रीम शून्य नहीं है, अगर नहीं तो स्ट्रीम बंद करें।

SavedEventSet sES; 
    OpenFileDialog oFD = new OpenFileDialog(); 
    Stream stream = null; 
    BinaryFormatter bF; 

    try 
    { 
    oFD.InitialDirectory = this.path; 
    oFD.Title = "Open Event Saved File."; 
    oFD.ShowDialog(); 

    if (oFD.FileName.Contains(".sav")) 
    { 
     stream = File.Open(oFD.FileName, FileMode.Open); 
     bF = new BinaryFormatter(); 

     sES = (SavedEventSet)bF.Deserialize(stream); 
     stream.Close(); 

    } 
    } 
    catch (Exception ex) 
    { 
    if (stream != null) 
     stream.Close(); 
    /*handle Exception*/ 
    } 
+0

मुझे समझ नहीं आता क्यों यह सिर्फ के साथ शुरू अशक्त नहीं है। लेकिन यह काम किया, धन्यवाद :) – EatATaco

+0

मुझे लगता है कि डिफ़ॉल्ट मान शून्य है, यानी आप संभावित संकलक चेतावनियों से बचने के लिए केवल स्पष्ट रूप से शून्य निर्दिष्ट कर सकते हैं। – i486

4

एक अंत में ब्लॉक का उपयोग करें, इस पर अमल करेंगे कि क्या एक अपवाद हुआ है या नहीं:

try 
{ 
    oFD.InitialDirectory = this.path; 
    oFD.Title = "Open Event Saved File."; 
    oFD.ShowDialog(); 

    if(oFD.FileName.Contains(".sav")) 
    { 
    stream = File.Open(oFD.FileName, FileMode.Open); 
    bF = new BinaryFormatter(); 

    sES = (SavedEventSet)bF.Deserialize(stream); 
    } 
} 
catch (Exception ex) 
{ 
    /*handle Exception*/ 
} 
finally 
{ 
    if (stream != null) 
    stream.Close(); 
} 
+0

यह वास्तव में काम नहीं करता है। मुझे वही "असाइन किया गया स्थानीय चर" समस्या मिलती है। – EatATaco

+0

मैं इस विकल्प को भी पसंद करूंगा, लेकिन इसे काम करने के लिए, आपको स्ट्रीम/प्रयास/अंत में ब्लॉक के बाहर स्ट्रीम करने की आवश्यकता है। –

+0

@ वाग्नेर सिल्वीरा - उन्होंने इसे ब्लॉक के बाहर बनाया है। – Oded

0
SavedEventSet sES; 
OpenFileDialog oFD = new OpenFileDialog(); 
BinaryFormatter bF; 

try 
{ 
    oFD.InitialDirectory = this.path; 
    oFD.Title = "Open Event Saved File."; 
    oFD.ShowDialog(); 

    if(oFD.FileName.Contains(".sav")) 
    { 
     using(Stream stream = File.Open(oFD.FileName, FileMode.Open)) 
     { 
      bF = new BinaryFormatter(); 

      sES = (SavedEventSet)bF.Deserialize(stream); 
      stream.Close(); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    /*handle Exception*/ 
} 
संबंधित मुद्दे