2011-05-31 18 views
15

ho una stringa che è args[0]Utilizzando StreamReader per verificare se un file contiene una stringa

qui è il mio codice finora:

static void Main(string[] args) 
{ 
    string latestversion = args[0]; 
    // create reader & open file 
    using (StreamReader sr = new StreamReader("C:\\Work\\list.txt")); 
    { 
     while (sr.Peek() >= 0) 
     { 
     //code here 
     } 
    } 
} 

Vorrei verificare se il mio file list.txt contiene args[0]. In tal caso, creerò un altro processo StreamWriter per scrivere una stringa 1 nel file o scrivere 0 nel file. Come lo faccio?

+1

Quanto è grande il file? –

+0

la dimensione è di circa 69kb – jeremychan

risposta

26

Ti aspetti che il file sia particolarmente grande? In caso contrario, il modo più semplice di farlo sarebbe quello di leggere solo il tutto:

using (StreamReader sr = new StreamReader("C:\\Work\\list.txt")) 
{ 
    string contents = sr.ReadToEnd(); 
    if (contents.Contains(args[0])) 
    { 
     // ... 
    } 
} 

Oppure:

string contents = File.ReadAllText("C:\\Work\\list.txt"); 
if (contents.Contains(args[0])) 
{ 
    // ... 
} 

In alternativa, si poteva leggere riga per riga:

foreach (string line in File.ReadLines("C:\\Work\\list.txt")) 
{ 
    if (line.Contains(args[0])) 
    { 
     // ... 
     // Break if you don't need to do anything else 
    } 
} 

O ancora più simile a LINQ:

if (File.ReadLines("C:\\Work\\list.txt").Any(line => line.Contains(args[0]))) 
{ 
    ... 
} 

Notare che ReadLines è disponibile solo da .NET 4, ma si potrebbe ragionevolmente chiamare TextReader.ReadLine in un loop.

+0

perché non solo - string contents = File.ReadAllLines ("c: \\ work \\ list.txt"); – Andrew

+1

Questo codice potrebbe essere lento sui file di grandi dimensioni – VMAtm

+0

@Andrew: Beh, questo non si compila :) Ma puoi usare 'File.ReadAllText', che ho dato come alternativa. Se leggi tutto in una volta sola, potresti farlo anche tu, ma se hai bisogno di leggerlo riga per riga (per risparmiare memoria), allora 'ReadLines' è più efficiente. –

0
if (System.IO.File.ReadAllText("C:\\Work\\list.txt").Contains(args[0])) 
{ 
... 
} 
3
  1. Non si dovrebbe aggiungere il ';' alla fine dell'istruzione using.
  2. Codice di lavorare:

    string latestversion = args[0]; 
    
    using (StreamReader sr = new StreamReader("C:\\Work\\list.txt")) 
    using (StreamWriter sw = new StreamWriter("C:\\Work\\otherFile.txt")) 
    { 
         // loop by lines - for big files 
         string line = sr.ReadLine(); 
         bool flag = false; 
         while (line != null) 
         { 
          if (line.IndexOf(latestversion) > -1) 
          { 
           flag = true; 
           break; 
          } 
          line = sr.ReadLine(); 
         } 
         if (flag) 
          sw.Write("1"); 
         else 
          sw.Write("0"); 
    
         // other solution - for small files 
         var fileContents = sr.ReadToEnd(); 
         { 
          if (fileContents.IndexOf(latestversion) > -1) 
           sw.Write("1"); 
          else 
           sw.Write("0"); 
         } 
    } 
    
+1

La tua condizione 'line.Length> 0' dovrebbe essere' line! = Null' - altrimenti ti fermerai sulla prima riga vuota * o * genererai un'eccezione quando raggiungi la fine del file. Inoltre, il tuo primo bit scrive un 1 o 0 * per ogni riga * del file di input; Non penso sia necessario. –

+0

Grazie per il corretto – VMAtm

Problemi correlati