2011-07-24 28 views
12

Giả sử tôi đang viết một chuỗi rất dài vào một tệp bằng File.WriteAllText và một luồng hoặc quá trình khác đang cố đọc cùng một tệp. Nó có ném bất kỳ ngoại lệ nào không? Nói cách khác, tham số FileShare mà phương thức File.WriteAllText sử dụng là gì? Nó không được viết trong tài liệu!File.WriteAllText và truy cập đồng thời

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx) –

+0

@Jalal MSDN không ghi lại chế độ chia sẻ nào được sử dụng bởi 'Tệp .WriteAllText'. – CodesInChaos

+0

Xin lỗi, tôi đã đọc rất nhanh. Tôi nghĩ rằng ông đã hỏi về 'FileShare' .. –

Trả lời

9

Đây là mã nguồn từ .net Framework 4.0. rõ ràng StreamWriter được sử dụng mà sử dụng FileShare.Read nội bộ.

[SecuritySafeCritical] 
public static void WriteAllText(string path, string contents) 
{ 
    if (path == null) 
    { 
     throw new ArgumentNullException("path"); 
    } 
    if (path.Length == 0) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath")); 
    } 
    InternalWriteAllText(path, contents, StreamWriter.UTF8NoBOM); 
} 


private static void InternalWriteAllText(string path, string contents, Encoding encoding) 
{ 
    using (StreamWriter writer = new StreamWriter(path, false, encoding)) 
    { 
     writer.Write(contents); 
    } 
} 

Đây là mã tạo luồng cơ bản cho StreamWriter.

private static Stream CreateFile(string path, bool append) 
{ 
    return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan); 
} 
5

MSDN không ghi lại chế độ chia sẻ nào được sử dụng.

Bạn có thể xem mã nguồn (hoặc được xuất bản hoặc qua bộ tách rời) hoặc xem tùy chọn lúc chạy (ví dụ: sử dụng Process Monitor và sau đó dịch cờ WIn32 API thành giá trị FileShare).

Nhưng vì nó không được tài liệu bản vá hoặc phiên bản mới có thể thay đổi. Ngoài ra, nếu nó tự mở tập tin bằng cách sử dụng một trong các quá tải FileStream có tham số FileShare, hãy mở StreamWriter qua điều này và sau đó viết văn bản.

Nó có ném bất kỳ ngoại lệ nào không?

Có. Nếu tệp đã được mở với chế độ chia sẻ không tương thích thì mở sẽ thất bại.

+0

Dựa trên một số tìm kiếm trong một disassembler,' File.WriteAllText' sử dụng một 'FileStreamn' đi qua' FileShare.Read'. – Richard

+0

+1 cho "Nhưng vì nó không phải là tài liệu một bản vá hoặc phiên bản mới có thể thay đổi nó." – CodesInChaos

+0

Phiên bản framework nào bạn đã tháo rời? – Mehran

4

Nó có ném bất kỳ ngoại lệ nào không?

Có. Bạn nên đảm bảo rằng trong khi một tiến trình đang ghi vào một tệp mà người khác không đọc được bằng cách sử dụng lock. Ngay cả khi bạn đặt tham số FileShare thành Read chẳng hạn, điều này sẽ cho phép mở tệp tiếp theo để đọc và không ném ngoại lệ ngay lập tức thì không phải là ý tưởng hay vì những người đọc đó có thể sẽ nhận được kết quả bị hỏng.

+0

Bạn sẽ sử dụng loại khoá nào cho khóa liên tiếp? Tôi cho rằng khối 'lock {/ * code * /}' thông thường sẽ không đủ. –

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