2011-02-11 15 views
30

Şu anda, bu bir dosyayı açıyorum nasıl okumaktır:Açık dosyanın sadece okunabilir

using (TextReader reader = new StreamReader(Path.Combine(client._WorkLogFileLoc, "dump.txt"))) 
{ 
    //do stuff 
} 

Ben SaltOkunur modunda dosyayı açabilirsiniz Nasıl böylece başka süreç aynı anda açık dosya varsa zaman, programım hala okuyabiliyor. Dosyayı salt okunur açmak istiyorsanız

+0

Akışı Oku modunda açmak istiyor musunuz? Veya ReadOnly dosya özniteliğini ayarlamak ister misiniz? –

+0

Açmak için ReadOnly – xbonez

+0

Başka bir işlem dosyanın açık olması durumunda, bu işlemin okunabilmeniz için okuma paylaşımını etkinleştirmiş olması gerektiğini unutmayın. Diğer işlem dosyayı reddedilmiş olarak açtıysa, dosyayı salt okunur olarak açmanız bile önlenmiş olur. Daha fazla bilgi için FileShare numaralandırmasına (veya Win32 eşdeğerine) bakın. – itowlson

cevap

73

Tipik bir problem, diğer işlemlerin dosya açmak için açılmış olmasıdır. Tüm standart Dosya yöntemleri ve StreamReader kurucuları FileShare.Read ile dosyayı açar. Bu işe yaramaz, bu yazma paylaşımını reddeder. Yazmayı inkar edemezsiniz, diğer süreç önce yazılmıştır ve yazma erişimi vardır. Yani bunun yerine erişim reddedilecek.

Bunu, FileShare.ReadWrite kullanmak zorunda:

var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
using (var sr = new StreamReader(fs)) 
{ 
    // etc... 
} 

yine zor bir problem olacağı anlamına dikkat, yarım yazılı dosyayı okuyor. Diğer süreç, verileri zaman içerisinde rastgele noktalarda temizler, sadece yarım satırlık bir metni okuyabilirsiniz. YMMV.

+0

Teşekkürler. Aradığım şey bu gibi görünüyor. Yarım yazılı bir dosyayı okumak, programımın dosyayı okumayı nasıl başaracağından dolayı benim için bir sorun olmayacaktır. – xbonez

+0

Bu beni kurtardı! Hakettiğiniz gibi, tüm diğer işlevler FileShare.Read ile açılıyor. Streanreader işlevlerinin farklı varyantlarıyla anlamaya çalışmak için uzunca bir süredir çalışıyordum. –

3

Sen File.SetAttributes

string path = Path.Combine(client._WorkLogFileLoc, "dump.txt"); 
FileAttributes curAttributes = File.GetAttributes(path); 
File.SetAttributes(path, curAttributes | FileAttributes.ReadOnly); 
11

arayarak dosya özniteliği ayarlayabilirsiniz, şunu deneyin:

 using (TextReader reader = new StreamReader(File.OpenRead(Path.Combine(client._WorkLogFileLoc, "dump.txt")))) {  
     //do stuff 
    } 

Bildirimi File.OpenRead() çağrısını.

+0

Darn, beni saniyelerle yendi. p + 1 size. –

+0

Benim için çalışmadı. Hans yaptı. – nawfal

İlgili konular