2011-05-31 27 views
15

tôi có một chuỗi đó là args[0]Sử dụng StreamReader để kiểm tra xem một tập tin chứa một chuỗi

đây là mã của tôi cho đến nay:

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

Tôi muốn kiểm tra xem tập tin list.txt tôi chứa args[0]. Nếu tôi có, sau đó tôi sẽ tạo một quy trình khác StreamWriter để viết một chuỗi 1 vào tệp hoặc viết 0 vào tệp. Tôi phải làm nó như thế nào?

+1

Làm thế nào lớn là các tập tin? –

+0

kích thước khoảng 69kb – jeremychan

Trả lời

26

Bạn có mong đợi tệp đặc biệt lớn không? Nếu không, cách đơn giản nhất để làm việc đó sẽ được chỉ đọc toàn bộ điều:

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

Hoặc:

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

Ngoài ra, bạn có thể đọc từng dòng một:

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

Hoặc thậm chí nhiều hơn LINQ giống như:

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

Lưu ý rằng ReadLines chỉ khả dụng từ .NET 4, nhưng thay vào đó bạn có thể dễ dàng gọi số TextReader.ReadLine trong vòng lặp.

+0

tại sao không chỉ - nội dung chuỗi = File.ReadAllLines ("c: \\ work \\ list.txt"); – Andrew

+1

Mã này có thể bị chậm trên các tệp lớn – VMAtm

+0

@Andrew: Vâng điều đó sẽ không biên dịch :) Nhưng bạn có thể sử dụng 'File.ReadAllText', mà tôi đã đưa ra như là một thay thế khác. Nếu bạn định đọc mọi thứ trong một lần, bạn cũng có thể làm điều đó - nhưng nếu bạn cần đọc từng dòng một (để tiết kiệm bộ nhớ) thì 'ReadLines' hiệu quả hơn. –

0
if (System.IO.File.ReadAllText("C:\\Work\\list.txt").Contains(args[0])) 
{ 
... 
} 
3
  1. Bạn không nên thêm ';' ở cuối câu lệnh sử dụng.
  2. Mã để làm việc:

    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

Điều kiện 'line.Length> 0' của bạn phải là' line! = Null' - nếu không bạn sẽ dừng lại trên dòng trống đầu tiên * hoặc * ném một ngoại lệ khi bạn đến cuối tệp. Ngoài ra, bit đầu tiên của bạn viết 1 hoặc 0 * cho mỗi dòng * của tệp đầu vào; Tôi không nghĩ rằng đó là yêu cầu. –

+0

Cảm ơn bạn đã sửa – VMAtm

Các vấn đề liên quan