2012-12-04 33 views
6

Tôi có khối mã sau đây khiến tôi đau đầu.FileStream khóa một tệp để đọc và viết C#

Về mặt logic, nó sẽ hoạt động như tôi đang sử dụng luồng phim cung cấp khóa trong câu lệnh sử dụng. Khi nó được vào dòng tạo StreamWriter, nó không nói "tập tin không thể ghi".

Hiện chương trình của tôi là một ứng dụng đa luồng. Bất kỳ chủ đề nào cũng có thể đang cố ghi vào tệp này. Tôi cần chương trình để khóa tập tin, đọc nội dung, kiểm tra nội dung, sau đó viết lại bất kỳ thay đổi nào. Trong quá trình đó, không có chuỗi nào khác có thể truy cập tệp đó.

using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
{ 
    var sr = new StreamReader(fs); 
    var str = sr.ReadToEnd(); 
    var strArray = str.Split(','); 
    if (strArray.Any(st => st == text)) 
    { 
     return; 
    } 
    sr.Close(); 

    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

Trả lời

6

Các FileShare.None cờ không gây đề phải xếp hàng, nó chỉ khóa các tập tin, vì thế mà ngoại lệ mà bạn nhận được. Để cung cấp quyền truy cập lẫn nhau, bạn có thể khóa một đối tượng được chia sẻ trước khi viết.

Nhưng bạn nói điều này "Bây giờ chương trình của tôi là một ứng dụng đa luồng. Bất kỳ chủ đề nào cũng có thể cố gắng ghi vào tệp này." Bây giờ, làm những chủ đề này tất cả sử dụng chính xác cùng một phương pháp để ghi vào tập tin? Giả sử họ, thì đây nên làm việc ...

Tạo một biến lớp tĩnh ...

private static object lockObject = new object(); 

Sử dụng nó ở đây ...

lock (lockObject) 
{ 
    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

Tôi đã thực hiện một số giả định về các chủ đề, vì vậy bạn có thể phải tìm kiếm thông tin về đồng bộ hóa nếu điều này không hoạt động hoặc cung cấp thêm một số thông tin cho chúng tôi.

Ngoài ra, vui lòng đóng StreamReader của bạn trước đó (trong trường hợp phương thức trả về trước đó). Đóng nó ngay lập tức sau khi bạn sử dụng nó.

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