2010-12-06 8 views
8

Uygulamalarımdan biri kullanımda olan dosyaları okuma (ve sadece okuma) amaçlamaktadır. örneğin, daha önceden açılmış bir dosyayı okurkenŞu anda kullanılan bir dosya nasıl okunur, Windows kopyalanırken ne yapar?

Fakat, Microsoft Word, bu uygulama atar

bir System.IO.IOException:

o varlık olduğu için dosyayı 'Burada < dosya adı >' erişemez süreç başka bir işlem tarafından kullanılır.

dosyayı okumak için kullanılan koddur: Elbette

using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) 
{ 
    // Do stuff here. 
} 

, dosya zaten kullanılan bu yana, bu istisna bekleniyor. Sonra okumak için, yeni bir konuma dosyayı kopyalamak için işletim sistemini sorarsanız

Şimdi, çalışır: zaten kullanılmış dosyayı okumak için izin verir File.Copy büyüsü nedir

string tempFileName = Path.GetTempFileName(); 
File.Copy(fileName, tempFileName, true); 
//           ↓ We read the newly created file. 
using (Stream stream = new FileStream(tempFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) 
{ 
    // Do stuff here. 
} 

Bir uygulama ile, özellikle bu sihri geçici bir kopyasını almadan dosyayı okumak için nasıl kullanılır?

+0

Kodun benim için iyi çalışıyor. Yukarıdaki snippet'inizde olmasa da, uygulamanızda FileAccess.Write belirtebilmeniz mümkün mü? –

+0

Ciaran Keating'in dediği gibi orijinal kodunuz benim için çalışıyor. "// Burada şeyler yap" da ne yapıyorsun? –

cevap

4

Güzel soru var. Bu bir göz atın, FileShare.ReadWrite kullanarak önermek için sadece anahtar olduğunu, bir atış değer.

http://www.geekzilla.co.uk/viewD21B312F-242A-4038-9E9B-AE6AAB53DAE0.htm

+0

Yorumları okumak, bazı durumlarda çalışıyor gibi görünüyor ve başkalarında yok. Benim durumumda, Microsoft Word tarafından zaten açılmış bir dosya ile 'FileShare.ReadWrite 'seçeneğine geçmek sorunu çözmüyor. –

+0

Bu sinir bozucu, aynı blogpost da aynı şeyi önerir. http://alexpinsker.blogspot.com/2005/03/how-to-read-file-thats-in-use-by.html Bir sorun var gibi gözüküyor * zaten * okunduğunda, aksine okur (uygulamanız). – Tom

+0

Daha fazla bilgi için File.Open kullanılması, burada önerildiği gibi bir FileStream döndürür: http://aautar.digital-radiation.com/blog/?p=1292 – Tom

0

, FileStream yapıcısından veya en azından FileShare.Delete'den FileShare.ReadWrite | FileShare.Delete kaldırmayı deneyin.

+6

bu bayraklar, hangi * diğer * dosya akışlarının, o anda açılmış olana sahip olmalarına izin verdiğini belirtir - bu bayrakların belirtilmesi, kilidin * daha zayıf olması gerektiğini belirtir *, böylece ifadeniz yanlıştır. – BrokenGlass

+0

Açıklama için teşekkürler – skajfes

+0

Evet, ancak paylaşım modunuz dosyadaki diğer var olanlarla tutarlı olmalıdır. Sadece "tutarlı" olan şey benim için biraz belirsiz. Örneğin, Word'de bir dosya açıkken, Read | Write (Yazma) Write (Paylaşım Yazma) bir paylaşım moduyla açabilirim, sadece kendi başına okuyamıyor veya kendi başına yazamıyor. –