2011-02-11 39 views
30

Hiện nay, đây là cách tôi đang mở một tập tin để đọc nó:mở tập tin ReadOnly

using (TextReader reader = new StreamReader(Path.Combine(client._WorkLogFileLoc, "dump.txt"))) 
{ 
    //do stuff 
} 

Làm thế nào tôi có thể mở tập tin trong chế độ ReadOnly, do đó nếu quá trình khác có file mở cùng thời gian, chương trình của tôi vẫn có thể đọc được.

+0

Bạn muốn mở luồng ở chế độ Đọc? Hay bạn muốn đặt thuộc tính tệp ReadOnly? –

+0

Muốn mở nó ReadOnly – xbonez

+0

Lưu ý rằng nếu một tiến trình khác có tệp đang mở, quá trình đó vẫn phải bật tính năng chia sẻ đọc để bạn có thể đọc nó. Nếu quá trình khác mở tệp có chia sẻ bị từ chối, thì ngay cả khi mở tệp ở dạng chỉ đọc sẽ bị ngăn chặn. Xem liệt kê FileShare (hoặc tương đương Win32) để biết thêm thông tin. – itowlson

Trả lời

73

Vấn đề điển hình là quy trình khác có tệp mở để ghi. Tất cả các phương thức File tiêu chuẩn và các nhà xây dựng StreamReader đều mở tệp bằng FileShare.Read. Điều đó không thể làm việc, điều đó phủ nhận việc chia sẻ viết. Bạn không thể từ chối viết, quá trình khác là đầu tiên và có quyền ghi. Vì vậy, bạn sẽ bị từ chối truy cập để thay thế.

Bạn phải sử dụng FileShare.ReadWrite, như thế này:

var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
using (var sr = new StreamReader(fs)) 
{ 
    // etc... 
} 

Ghi chú rằng bạn vẫn sẽ có một vấn đề khó khăn, bạn đang đọc một tập tin nửa bằng văn bản. Quá trình khác xóa dữ liệu vào tệp tại các điểm ngẫu nhiên trong thời gian, bạn cũng có thể đọc chỉ một nửa dòng văn bản. YMMV.

+0

Cảm ơn. Có vẻ như đây là những gì tôi đang tìm kiếm. Đọc một nửa tập tin bằng văn bản sẽ không phải là một vấn đề đối với tôi vì chương trình của tôi xử lý đọc tập tin như thế nào. – xbonez

+0

Điều đó đã cứu tôi! Như bạn đã nói đúng, tất cả các chức năng khác đang mở với FileShare.Read. Tôi đã cố gắng kể từ một thời gian khá dài để tìm ra các biến thể khác nhau của các chức năng streanreader ...! –

3

Bạn có thể thiết lập các thuộc tính tập tin bằng cách gọi File.SetAttributes

string path = Path.Combine(client._WorkLogFileLoc, "dump.txt"); 
FileAttributes curAttributes = File.GetAttributes(path); 
File.SetAttributes(path, curAttributes | FileAttributes.ReadOnly); 
11

Nếu bạn muốn mở file read-only, hãy thử này:

 using (TextReader reader = new StreamReader(File.OpenRead(Path.Combine(client._WorkLogFileLoc, "dump.txt")))) {  
     //do stuff 
    } 

Thông báo cuộc gọi đến File.OpenRead().

+0

Darn, đánh bại tôi từng giây. ; p +1 cho bạn. –

+0

Không làm việc cho tôi. Hans đã làm. – nawfal

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