2010-02-09 27 views
7

Hệ điều hành đích: Win2003Là tệp.Delete() nguyên tử theo .NET

Như được đăng trong các câu hỏi SO khác về nguyên tử hoạt động tệp, Win32 không được thiết kế cho giao dịch. Tôi vẫn tự hỏi liệu việc xóa tệp có thể không phải là nguyên tử hay không. Sau khi tất cả, nó hoặc là bị xóa hay không. Hoặc một tập tin có thể tồn tại trong bất kỳ trạng thái trung gian nào khác trên hệ thống tập tin NTFS gây ra bởi sự cố hệ thống hoặc một cái gì đó khác trong quá trình xóa không?

Trả lời

12

NTFS là journaled file system. Một tạp chí về cơ bản tương đương với nhật ký giao dịch trong cơ sở dữ liệu. Nó sẽ đảm bảo tính nhất quán và tính toàn vẹn của các cấu trúc hệ thống tệp như một cơ sở dữ liệu làm cho các bảng của nó. Trong khi File.Delete không có bất kỳ mã giao dịch nào ở mức cao, NTFS vẫn duy trì tính toàn vẹn giao dịch ở cấp hệ thống tệp. Điều này có thể không đúng đối với các trình điều khiển hệ thống tệp khác.

5

Cũ câu hỏi, nhưng nếu tôi có thể thêm vào @ câu trả lời Mehdrad, từ một quan điểm hơi khác nhau ...

Trên Windows, xóa một tập tin thường thậm chí không hoàn toàn đồng bộ, và nó không phải là ngay cả một hoạt động đơn lẻ. Theo nghĩa đó, nó chắc chắn không phải nguyên tử.

Nếu bạn nhìn vào các công cụ như process monitor hoặc xem tài liệu MSFT để viết trình điều khiển hệ thống tệp, bạn sẽ nhận thấy rằng để xóa tệp trên Windows là một quy trình nhiều bước. Trước tiên, bạn cần xử lý tệp. Sau đó, bạn đặt bố cục của nó thành "đã xóa". Điều này đặt tệp ở trạng thái có tệp "xóa đang chờ xử lý". Tệp thậm chí sẽ không bị xóa khỏi chế độ xem cho đến khi tay cầm cuối cùng bị đóng. Khi một tệp ở trạng thái này, các lần thử mở tệp mới sẽ không thành công với STATUS_DELETE_PENDING. Tình trạng này là nhiều hơn một điều thời gian chạy - nếu bạn kéo các plug hoặc đã làm một khởi động lại các tập tin sẽ không ở trong trạng thái đó. Vì vậy, nó có thể hoặc có thể không liên quan đến cách bạn đang sử dụng xóa, nhưng điều quan trọng cần lưu ý rằng trên Windows xóa sẽ không cần thiết có hiệu lực ngay lập tức và theo truy cập đồng thời có thể khóa thêm yêu cầu ra khỏi tập tin.

+0

Để làm rõ: Như đã giải thích, quy trình thời gian chạy để xóa tệp không phải là nguyên tử vì nó bao gồm nhiều bước. Tuy nhiên, hành động thực tế trong hệ thống tập tin (NTFS) _is_ nguyên tử, do đó việc xóa hoặc là thể chất được thực hiện như một tổng thể hay không. – mafu

+0

@mafutrct - Tôi không đồng ý với đánh giá của bạn. Như tôi đã đề cập xóa một tập tin trên NT là một quá trình nhiều bước và có thể được quan sát để không hoàn thành cho đến khi xử lý cuối cùng cho tập tin được giảm xuống. – asveikau

+1

Có, nhưng những thay đổi vật lý đối với hệ thống tệp (trái ngược với các bước thay đổi ảo trong RAM bạn giải thích) hoạt động nguyên tử, nếu tôi hiểu điều này một cách chính xác. Đó là, không có vấn đề khi trong quá trình xóa dưới NTFS bạn ngắt hệ thống, nhà nước sẽ nhất quán - các tập tin hoặc là sẽ bị xóa hoàn toàn, hoặc nó sẽ không bị xóa ở tất cả. Tôi tin rằng điều này là quan trọng, vì nếu nó không phải là trường hợp quá trình xóa một tập tin sẽ phải được xử lý rất khác nhau trong mã người dùng. "Nguyên tử" có lẽ là một thuật ngữ hơi gây hiểu nhầm cho toàn bộ ý tưởng đó. – mafu

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