2009-10-22 52 views
17

StreamReader khóa một tệp văn bản trong khi nó đang đọc nó.
Tôi có thể buộc StreamReader hoạt động ở chế độ "chỉ đọc" hoặc "không khóa" không?Tôi có thể ngăn StreamReader khóa một tệp văn bản trong khi đang sử dụng không?

Giải pháp của tôi là sao chép tệp vào vị trí tạm thời và đọc tệp từ đó nhưng tôi muốn sử dụng trực tiếp StreamReader nếu có thể. Bất kỳ suggetions thay thế?

Bối cảnh:
Tôi đã viết một ứng dụng nhỏ để lấy một số thống kê trong tệp nhật ký. Tập tin này liên tục được cập nhật (vài lần một giây) bởi một chương trình bên ngoài cho phép gọi AAXXYY.

Xem lại kết quả cho thấy ứng dụng của tôi có thể đang khóa tệp và ngăn không cho AAXXYY viết.

Đây là những gì tôi đang làm

private void btnGetStats_Click(object sender, EventArgs e) 
    { 
     int countStarts = 0; 
     int countEnds = 0; 

     IList<string> sessions = new List<string>(); 

     using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode)) 
     { 
      while(!stRead.EndOfStream) 
      { 
       string line = stRead.ReadLine(); 
       if(line.Contains("Session start")) 
       { 
        countStarts++; 
        sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("["))); 
       } 
       if (line.Contains("Session end")) 
       { 
        countEnds++; 
        sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("["))); 
       } 
      } 
     } 

     txtStarts.Text = countStarts.ToString(); 
     txtEnds.Text = countEnds.ToString(); 
     txtDifference.Text = (countStarts - countEnds).ToString(); 

     listBox1.DataSource = sessions; 
    } 

Trả lời

38

Bạn có thể vượt qua một FileStream đến StreamReader, và tạo ra FileStream với giá trị FileShare thích hợp. Ví dụ:

using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var reader = new StreamReader (file, Encoding.Unicode)) { 
} 
+0

+1 tính năng này hoạt động tốt. Cảm ơn bạn. Mặc dù tôi đã phải thay thế "var" bằng FileStream & StreamReader. Những gì đã được var suppossed để làm gì? Đó có phải là VB không? Tôi nghĩ rằng câu trả lời này nên được chỉnh sửa để thay đổi những điều đó nhưng tôi không có đại diện để tự mình làm điều đó –

+6

Về từ khóa 'var', hãy xem liên kết này: http://msdn.microsoft.com/en-us/library/bb383973 .aspx. Từ khóa đó là mới trong C# 3.0+. – pyrocumulus

+0

Aha. Cảm ơn đám mây. Phục vụ tôi đúng khi làm việc trong thời đại tăm tối. Xấu hổ Tôi không thể +1 nhận xét :-) –

6

Nghĩ rằng tôi muốn thêm một số bối cảnh, StreamReader không khóa một tập tin để đọc chỉ để viết suýt nó đang được đọc. Hãy xem mã bên dưới từ lớp StreamReader.

new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan); 

Thông báo tham số FileAccess.Read mặc định lấy cho MSDN http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

Cho phép mở tiếp theo của tập tin để đọc. Nếu cờ này không được chỉ định, mọi yêu cầu mở tệp để đọc (theo quy trình này hoặc quy trình khác) sẽ không thành công cho đến khi tệp được đóng. Tuy nhiên, ngay cả khi cờ này được chỉ định, vẫn có thể cần thêm quyền truy cập để truy cập tệp.

Một lần nữa được lấy từ MSDN để cho phép đọc và ghi sử dụng FileAccess.ReadWrite thay thế (theo đề xuất của Jb Evain).

Cho phép mở tệp tiếp theo để đọc hoặc viết. Nếu cờ này không được chỉ định, mọi yêu cầu mở tệp để đọc hoặc viết (theo quy trình này hoặc quy trình khác) sẽ không thành công cho đến khi tệp bị đóng. Tuy nhiên, ngay cả khi cờ này được chỉ định, các quyền bổ sung vẫn có thể cần để truy cập tệp.

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