2011-03-17 4 views
14

posso aprire un FileStream conFile.ReadLines senza bloccarlo?

new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

senza bloccare la lima.

Posso fare lo stesso con File.ReadLines(string path)?

+5

[La documentazione] (http://msdn.microsoft.com/en-us/library/dd383503.aspx) non dice nulla sul comportamento di blocco di ReadLines. Quindi, anche se dovesse risultare che l'implementazione di .net Framework che si utilizza non blocchi il file, non è qualcosa su cui puoi fare affidamento quando sviluppi la tua applicazione. – Heinzi

risposta

31

No ... Se si guarda con riflettore vedrete che alla fine File.ReadLines apre una FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 0x1000, FileOptions.SequentialScan);

Quindi condivisione di lettura sola.

(si apre tecnicamente una StreamReader con la FileStream come descritto sopra)

io aggiungo che sembra essere un gioco da ragazzi per fare un metodo statico per farlo:

public static IEnumerable<string> ReadLines(string path) 
{ 
    using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan)) 
    using (var sr = new StreamReader(fs, Encoding.UTF8)) 
    { 
     string line; 
     while ((line = sr.ReadLine()) != null) 
     { 
      yield return line; 
     } 
    } 
} 

Ciò restituisce un IEnumerable<string> (qualcosa di meglio se il file ha molte migliaia di righe e hai solo bisogno di analizzarle una alla volta). Se hai bisogno di un array, chiamalo come ReadLines("myfile").ToArray() usando LINQ.

Si prega di essere consapevoli del fatto che, logicamente, se il file cambia "dietro la sua schiena (del metodo)", come funzionerà tutto è piuttosto indefinito (probabilmente è tecnicamente definito, ma la definizione è probabilmente piuttosto lunga e complessa)

+0

per quanto ReSharper è uno strumento di profilazione, in questo caso è necessario utilizzare Reflector – abatishchev

+0

@abatishchev: non descriverei ReSharper come strumento di profilazione. Credo che ora possa fare anche la decompilazione (probabilmente solo in una versione beta). –

+1

Perché chiami il tuo metodo 'ReadAllLines' se il suo comportamento corrisponde a' ReadLines' e non a 'ReadAllLines'? – CodesInChaos

2

File.ReadLines() bloccherà il file fino al termine.

+1

La risposta dovrebbe rappresentare una soluzione o almeno dovrebbe sembrare che punta verso quella direzione. Risposta Il ricercatore conosce già il fatto che ha affermato, quindi non fa nulla di utile. –