2013-02-19 21 views
5

Bir Page_Load işlevi çağrılan aşağıdaki Kod var. Sayfa, Visual Studio'yu başlattıktan sonra ilk kez yüklendiğinde, her şey iyi çalışıyor.
Ama bundan sonra File başka açılış çağrı doğrudan Visual Studio Solution File açarak bu hataFileStream.close() diğer işlemler için dosya içermiyor

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(); 

Neden dosya hala kilitli (tabii değil İstisna olarak) döndürülür dahi IOException: "File is in use by another process" döndürür? ve neden tamamen Visual Studio yeniden başlatılıyor Dosyayı sıfırlamak? dosya Özellikler 'denetlerken diyor:

Eylem oluştur: İçerik
Kopya çıktı dizinine: Ben sadece bu dosya okuyorum

Kopya yoktur. Birden çok işlemin Dosyaya erişebilmesi için adLockOptimistic'a benzer bir şey yapabilir miyim?

+2

Yandaki notta: El ile nesneleri kapatıp elden çıkarmak yerine kullanma ifadesini kullanın –

cevap

7

Dosya neden hala kilitlendi? ve neden tamamen Visual Studio yeniden başlatılıyor Dosya sıfırlama? Dosya-Özellikler kontrol ederken [...] diyor Dosya neden hala kilitli olduğunu bilmiyorum: büyük olasılıkla akış kapalı/bertaraf edilmeden önce kodunuz başarısız olur.

Hakkında "neden tam yeniden başlatmadan Visual Studio [...]": IIS Express veya kimin IDE kapattığınızda dosyalar üzerinde kilitleri serbest bırakılır, böylece kapalı ASP.NET Dev Sunucusu kullanabilecek nedeniyle kilitleri tutan işlem artık çalışmıyor.

Ve hakkında "dosya neden hala kilitleniyor? [...]" bunun nedeni, dosya akışı kapatılamadı, çünkü bazen iş parçacığı başarılı bir şekilde bitmeyebilir ve kilitler serbest bırakılmayabilir. Diğer cevap söylediği gibi

, using blok IDisposable nesneler atılmaması olacağını önlemek nasıl kontrol edin: Ben sadece bu dosya okuyorum

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

. Birden çok işlemin Dosyaya erişebilmesi için adLockOptimistic'e benzer bir şey yapabilir miyim?

Evet, File.Open yöntem ve FileShare numaralandırma bakmak http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx
+1

+1 FileShare enum'da – jessehouwing

+0

@Matias Brace'leriniz hakkında yorum: "extra extra {}" dil sözdizimini kullanmanın kişisel bir tercihidir. Tek bir deyim bloğu, parantez içine alınmasını gerektirmez. Ve FileShare.ReadWrite, diğer işlemlerin dosyaya erişmesine izin verir, ancak açık bırakılan dosyanın sorununu çözmez. Güzel örnek ve iyi puanlar olsa da. – Suncat2000

0

using numaralı blokları kullanmayı deneyin, kilit sorununuzu çözmeyebilir, ancak atılabilir nesneler için daha iyi bir formdur.

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

, mailinglist_FileStream önce mailinglist_Reader kapatmayı deneyin.

+0

komik şey, siparişi değiştirdikten sonra, Page_Load çalışır, ancak benim catch (IOException) BLock hala çalıştırılır – Vogel612

+1

Call of Stream.Close 'kullanarak blok gereksizdir. –

+0

Ne istisna alıyorsunuz, aynı şey? İki 'Kapat();' muhtemelen 'kullanılarak' denilen satırları yorumlamayı deneyin. –

1

bilgi kullanımı using:

Bir istisna atılmış olsa bile, bloktan çıktığınızda dosyanın

yapısını kapatmasını sağlar.

Sorununuz burada olmayabilir, ancak kodunuzun başka bir yerinde olmayabilir. Tüm kodunuzu gözden geçirmeniz ve dosya açtığınız yerleri aramanız, ancak bir using bildiriminin içine koymanız gerekmeyecektir.

İlgili konular