2011-06-26 20 views
5

için dosyayı silinemiyor: "Başka bir işlem tarafından kullanıldığı için işlem '\ dosya adı' dosyasına erişemiyor"Aşağıdaki kod bu istisnayı atar MemoryMappedFile

Yeterince adil, ancak dosyanın silinebilmesi için okuyucu ve/veya mmf'yi kapatmanın doğru yolu nedir? MemoryMappedFile'ın bir close() yöntemine veya benzer bir şeye sahip olacağını düşünürdüm ama öyle değil.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır. Teşekkürler.

mmf = MemoryMappedFile.CreateFromFile(filename, 
     System.IO.FileMode.OpenOrCreate, 
     "myMap" + fileNo.ToString(), 
     fileSize); 

reader = mmf.CreateViewAccessor(0, accessorSize); 

<do stuff> 

File.Delete(filename); 

DÜZENLEMELER: sadece bu sorunu yaşıyorum yıkıcı gibi

görünüyor. Dispose() başka yerlerde çağrıldığında iyi çalışır, ancak aşağıdakileri yaptığımda istisna atar. Okuyucu ve mmf açıkça sınıfın üyeleridir. Kurucu girildikten sonra dosya erişimine örtük bir şey mi oluyor?

reader.Dispose(); 
mmf.Dispose(); 
File.Delete(filename); 
+1

Bu nesne daha önce GCed kullanılmış olabileceğinden, bir sonlandırıcıda diğer nesneleri atmaya (veya erişmeye) çalışmamalısınız. –

+0

Ancak, kapsam dışında kalmadan önce nesneleri temizleyebilmek için yıkıcı bir nokta değil mi? Yine de, bu sorunun kodun başka bir yerinde olduğunu düşündüğümde, bunun bir şey olduğunu düşünüyorum. Bu sadece yıkıcı bir sorun değil. – hdt

+0

Sonlandırıcı, yönetilmeyen kaynakları temizlemektir; okuyucu ve mmf yönetilen nesneler ARE. – Guillaume

cevap

3

önce dosyayı silmeden, sen haritalama atmanız gerektiğini

using (var mmf = MemoryMappedFile.CreateFromFile(filename, 
        System.IO.FileMode.OpenOrCreate, 
        "myMap" + fileNo.ToString(), fileSize)) 
{ 
    using (reader = mmf.CreateViewAccessor(0, accessorSize)) 
    { 
     ... <do stuff> ... 
    } 
} 

File.Delete(filename); 

Aksi reader üzerinde Dispose() arayıp mmf nesnesi, ancak using, istisnalar içine atılırsa temizlendiğinden emin olur <do stuff>.

+0

Teşekkürler. Bu yüzden ben bu konuyu karıştırdığımı düşünüyorum. Yukarıdakileri denedim ve işe yaramadı, ama etrafta bir şeyler taşıdıktan sonra sadece sınıf yıkıcısında işe yaramayacağını anladım (yani istisna atar). Yıkıcıda neden işe yaramayacağını biliyor musunuz, ama kodun başka bir yerinde mi çalışacak? – hdt

+0

Onu geri alıyorum. Yıkıcı dışındaki yerlerde sorunlara yol açar. – hdt

4

Sen eğer mümkünse using yapısı kullanmak gerekir:

~Class() 
{ 
    try 
    { 
     if (File.Exists(filename)) 
     { 
      reader.Dispose(); 
      mmf.Dispose(); 
      File.Delete(filename); 
     } 
    } 
    catch (Exception e) 
    { 
    } 
}