Tôi gặp sự cố chia sẻ tệp khi quá trình của tôi đang cố gắng đọc tệp nhật ký trong khi vẫn đang mở NLog. Trong chẩn đoán vấn đề, tôi thấy một điều gì đó đáng ngạc nhiên. Sau đây thất bại:Chia sẻ tệp không hoạt động như mong đợi
using (var fileStream1 = new FileStream("test.file", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fileStream2 = new FileStream("test.file", FileMode.Open, FileAccess.Read, FileShare.Read))
{
}
Thứ hai FileStream
gọi constructor không thành công với:
System.IO.IOException was unhandled
Message=The process cannot access the file 'c:\...\test.file' because it is being used by another process.
Source=mscorlib
StackTrace:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
Điều này bất chấp thực tế rằng FileStream
đầu tiên chỉ ra sự sẵn sàng của mình để chia sẻ đọc. Những gì tôi thấy thậm chí đáng ngạc nhiên hơn là công trình này:
using (var fileStream1 = new FileStream("test.file", FileMode.Append, FileAccess.Write, FileShare.Read))
using (var fileStream2 = new FileStream("test.file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
}
Um, vâng, yêu cầu hơn truy cập khi mở dòng thứ hai thực sự bỏ qua vấn đề này. Tôi hoàn toàn bối rối về lý do tại sao đó là trường hợp, và chỉ có thể giả định tôi hiểu nhầm điều gì đó. Tôi đã đọc qua các tài liệu API nhưng họ chỉ hỗ trợ mô hình tinh thần hiện tại của tôi về cách thức hoạt động này, trái với cách nó hoạt động.
Dưới đây là một số dấu ngoặc kép hỗ trợ từ docs:
Một sử dụng điển hình của kiểu liệt kê này là để xác định xem liệu hai quá trình đồng thời có thể đọc từ cùng một tập tin. Ví dụ: nếu tệp được mở là và Đọc được chỉ định, những người dùng khác có thể mở tệp để đọc nhưng không thể ghi.
Dưới đây là đá quý khác:
Các constructor FileStream sau mở một tập tin hiện có và tài trợ truy cập chỉ đọc cho người khác (đọc).
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);
bất cứ ai có thể rụng bất kỳ ánh sáng vào hành vi này. Tôi đang thử nghiệm này trên. NET 4% Windows XP.
Cảm ơn. Vì vậy, sự hiểu lầm này là rất phổ biến mà ngay cả các tài liệu là sai/gây hiểu nhầm? –
Bạn có nghĩa là bao gồm 'FileShare.Write' trên luồng thứ hai, phải không? – rookie1024