2011-05-31 20 views
15

tengo una cadena que es args[0]Usando StreamReader para comprobar si un archivo contiene una cadena

aquí es mi código hasta ahora:

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 
     } 
    } 
} 

me gustaría comprobar si mi archivo list.txt contiene args[0]. Si tengo, entonces crearé otro proceso StreamWriter para escribir una cadena 1 en el archivo, o escriba 0 en el archivo. ¿Cómo lo hago?

+1

¿Qué tan grande es el archivo? –

+0

el tamaño es de aproximadamente 69kb – jeremychan

Respuesta

26

¿Esperas que el archivo sea particularmente grande? Si no es así, la forma más sencilla de hacerlo sería la de simplemente leer todo el asunto:

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

O:

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

Alternativamente, se podía leer línea por línea:

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 incluso más LINQ-like:

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

Tenga en cuenta que ReadLines solo está disponible desde .NET 4, pero en su lugar podría llamar fácilmente al TextReader.ReadLine en un bucle.

+0

¿por qué no solo? String contents = File.ReadAllLines ("c: \\ work \\ list.txt"); – Andrew

+1

Este código puede ser lento en archivos grandes – VMAtm

+0

@Andrew: Bueno, eso no compilaría :) Pero puede usar 'File.ReadAllText', que he dado como otra alternativa. Si va a leer todo de una vez, también puede hacerlo, pero si necesita leerlo línea por línea (para ahorrar memoria), 'ReadLines' es más eficiente. –

0
if (System.IO.File.ReadAllText("C:\\Work\\list.txt").Contains(args[0])) 
{ 
... 
} 
3
  1. No debe agregar el ';' al final de la declaración de uso.
  2. código para trabajar:

    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

Su condición 'line.Length> 0' debe ser' line! = Null'; de lo contrario, se detendrá en la primera línea en blanco * o * arrojará una excepción cuando llegue al final del archivo. Además, su primer bit escribe un 1 o 0 * por cada línea * del archivo de entrada; No creo que sea obligatorio. –

+0

Gracias por la corrección – VMAtm

Cuestiones relacionadas