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
Trả lời
Đâ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);
}
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.
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
+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
Phiên bản framework nào bạn đã tháo rời? – Mehran
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.
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 đủ. –
- 1. Truy cập tệp PHP và đồng thời
- 2. đồng thời truy cập file
- 3. Tê giác và truy cập đồng thời vào javax.script.ScriptEngine
- 4. Máy ảnh UIImagePicker và AVCaptureSession truy cập đồng thời
- 5. truy cập biến đồng thời trong c
- 6. Truy cập đồng thời trong SQLite
- 7. iOS - Truy cập đồng thời vào tài nguyên bộ nhớ
- 8. Bản đồ có quyền truy cập đồng thời
- 9. Thực thể Khung làm mới và cập nhật đồng thời
- 10. bản đồ java cập nhật đồng thời
- 11. truy cập đồng bộ trong clojure
- 12. Truy cập cơ sở dữ liệu đồng bộ và không đồng bộ
- 13. Đồng thời AVCaptureVideoDataOutput và AVCaptureMovieFileOutput
- 14. Đồng thời và Đa luồng
- 15. Truy cập đồng thời vào một hàng đợi theo nhiều chủ đề
- 16. Hai chủ đề, cùng một biến tĩnh, cùng một giá trị, truy cập đồng thời
- 17. Haskell đồng thời và kiên trì
- 18. trong trường hợp nào tôi cần phải khóa một biến từ truy cập đồng thời?
- 19. Truy cập đọc đồng thời trên một mảng int []: Có an toàn không? Có nhanh không?
- 20. JAVA: Kiểm soát đồng thời để truy cập vào danh sách trong java
- 21. Truy cập đồng thời vào mảng được chia sẻ có vấn đề trong Node.js
- 22. Đồng thời Postgresql
- 23. Đọc và ghi SQLite đồng thời
- 24. Về thời gian truy cập unix
- 25. Đồng thời trong Lucene.NET.
- 26. Sử dụng Microsoft.WindowsAzure.StorageClient.TableServicesContext và phát hiện xung đột cập nhật đồng thời
- 27. Đọc và cập nhật đồng thời trong một bảng cơ sở dữ liệu
- 28. Đồng thời phát trực tuyến và lưu video?
- 29. Ghi và phát âm thanh Đồng thời
- 30. Scala - tương lai và đồng thời
[MSDN] (http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx) –
@Jalal MSDN không ghi lại chế độ chia sẻ nào được sử dụng bởi 'Tệp .WriteAllText'. – CodesInChaos
Xin lỗi, tôi đã đọc rất nhanh. Tôi nghĩ rằng ông đã hỏi về 'FileShare' .. –