2010-01-21 6 views
11

Bir akış açıp, akıştaki verileri yeniden seri hale getiriyorum. Ancak, SavedEventSet nesnesine bir üye ekledim, bu yüzden şimdi eski bir dosyayı açmaya çalıştığımda, istisna serisini seri hale getirme satırına atar.İstisna ettikten sonra bir akışın kapatılması

Bu benim için sorun değil (şimdilik) ancak sorun şu ki, özel durumla başa çıkıyorum, ancak hiçbir zaman akışı kapatmıyor (akış kapatılmadan önce istisna oluştu), bu yüzden dosyayı yeniden açmaya çalıştığımda, izin vermez çünkü kullanımda.

Bu özel durumdan sonra akışı nasıl kapatırım? Stream.Close() öğesini catch'a veya son olarak koyarsam, atanmamış bir yerel değişkene erişmeyi denemekten şikayet eder. Kötü bir uygulama açtığını biliyorum sadece orada olduğunu biliyorum rastgele bir dosyayı açmak için. Boş bir kurucuya benzeyecek şekilde bir akış açmanın herhangi bir yolu var mı, böylece atanmış gibi görünecek?

Teşekkür Try bloğundan önce null

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*/ 
} 

cevap

26

otomatik bir istisna var olsa bile, dere kapanacak bir using blok, kullanabilirsiniz:

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

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

+1. Sahnelerin arkasında bir deneme/yakalama bloğuna derler ve "Dispose()" olarak adlandırılır, yani "IDisposable" uygulamasının tüm uygulayıcılarında kullanılabilir. – STW

+0

Katılıyorum, bu tam olarak 'using' bloğu . – auujay

+0

Teşekkürler :) Kullanım bloğunu bilmiyordum bile. – EatATaco

6

Seti akışı.

Akışınızda, akışın boş olup olmadığını kontrol edin, değilse, akışı kapatın.

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

ile başlamak sadece boş değil neden anlamıyorum. Ama bu işe yaradı, teşekkürler :) – EatATaco

+0

Varsayılan değerin boş olduğunu düşünüyorum, yani yalnızca olası derleyici uyarılarını önlemek için boş olarak atayabilirsiniz. – i486

4

bir nihayet bloğu kullanın, bu durum oluştu olup olmadığını çalıştırır:

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

Bu aslında çalışmıyor. Aynı "atanmamış yerel değişken" problemini alıyorum. – EatATaco

+0

Ayrıca bu seçeneği tercih ederim, ancak çalışabilmesi için, try/catch/finally bloğu dışında kesilecek akışa ihtiyacınız var. –

+0

@Wagner Silveira - bloğun dışında oluşturdu. – 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*/ 
}