2012-03-18 27 views
32

Tôi đang theo dõi tệp văn bản đang được chương trình máy chủ viết. Mỗi khi tập tin được thay đổi, nội dung sẽ được xuất ra một cửa sổ trong chương trình của tôi.Đọc một tệp được sử dụng bởi một quy trình khác

Vấn đề là tôi không thể sử dụng Streamreader trên tệp vì nó đang là used by another process. Thiết lập Filestream với ReadWrite sẽ không hoạt động tốt vì tôi không thể kiểm soát quá trình đang sử dụng tệp.

Tôi có thể mở tệp bằng notepad. Nó phải có thể truy cập nó mặc dù máy chủ đang sử dụng nó.

Có cách nào tốt để giải quyết vấn đề này không?

Tôi có nên làm như sau không?

  1. Giám sát các tập tin
  2. Tạo một bản sao tạm thời của nó khi nó thay đổi
  3. Đọc bản sao tạm thời
  4. Xóa các bản sao tạm thời.

Tôi cần lấy văn bản trong tệp bất cứ khi nào máy chủ thay đổi.

Trả lời

67

Nếu sổ ghi chép có thể đọc tệp thì bạn có thể, rõ ràng chương trình không đặt khóa đọc trên tệp. Vấn đề bạn đang gặp phải là StreamReader sẽ mở tệp bằng FileShare.Read. Từ chối truy cập ghi. Điều đó không thể làm việc, chương trình khác đã đạt được quyền ghi.

Bạn sẽ cần phải tạo ra StreamReader như thế này:

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var sr = new StreamReader(fs, Encoding.Default)) { 
    // read the stream 
    //... 
} 

đoán tại Encoding đây. Bạn phải cẩn thận với loại mã này, chương trình khác đang tích cực ghi vào tệp. Bạn sẽ không nhận được một dấu hiệu kết thúc rất đáng tin cậy của tập tin, nhận được một phần cuối dòng là khá tốt. Đặc biệt rắc rối khi bạn tiếp tục đọc các tập tin để cố gắng để có được bất cứ điều gì chương trình nối.

+2

Cảm ơn bạn ... Tôi đã không nhận ra rằng FileShare.Read sẽ không chính xác trong trường hợp này. –

+2

Bằng cách sử dụng 'FileShare.ReadWrite | FileShare.Delete' bạn có thể truy cập vào nhiều tập tin hơn nữa. Đó là giá trị cố gắng khi 'FileShare.ReadWrite' là không đủ – Adassko

+0

@Adassko Hoặc khi' FileShare.Read' là không đủ, như trong trường hợp này, và trong tình huống cụ thể của tôi, nơi tôi đã sử dụng trong cùng một loại mã, và đã phải chuyển sang 'FileShare.ReadWrite' để làm cho nó hoạt động. – vapcguy

10

Gọi

File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite) 

này nên làm việc miễn là ứng dụng khác đã không bị khóa các tập tin độc quyền.

+0

Cảm ơn bạn. Điều đó có hoạt động kết hợp với bộ phát sóng không? Như thế này: File.Open (đường dẫn, FileMode.Read, FileAccess.Read, FileShare.ReadWrite); StreamReader reader = new StreamReader (đường dẫn); – Christoffer

+0

@Tophe: Tất nhiên. IIRC, ctor 'StreamReader' cũng có thể lấy trực tiếp các thông số này. – SLaks

+0

Điều đó trông như thế nào? Nếu tôi đặt FileMode.Open, FileAccess.Read, FileShare.ReadWrite làm tham số cho Streamreader nó sẽ không hoạt động. Nó nói rằng nó chỉ mất một số tham số mã hóa. – Christoffer

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