2013-03-07 32 views
8

Tôi đang cố tạo một tệp văn bản lớn bằng C# và một quá trình khác liên tục tìm kiếm vị trí và cố gắng tải tệp nếu có.File.Move hoạt động nguyên tử

Để làm cho các tập tin nguyên tử dưới đây là những bước sau:

1 - Write to file : Filename_temp.txt 
2 - Check if Filename.txt already exists then Delete 
3 - Do a File.Move to the same destination  
    From filename : Filename_temp.txt 
    TO : Filename.txt 

Kể từ C# không có đổi tên, tôi phải dựa vào File.Move, điều này không đảm bảo các hoạt động di chuyển sẽ là nguyên tử hoặc có cách nào khác để đạt được nguyên tử này không?

+1

bạn làm gì * chính xác * có nghĩa là, bằng cách nói: di chuyển nguyên tử? – Tigran

+0

Bạn có thể cập nhật cả hai ứng dụng logic không? Nếu có - hãy sử dụng Mutex để đồng bộ hóa quyền truy cập – sll

+0

Tôi khuyên bạn nên kiểm tra sự tồn tại và xóa trước tiên. Bạn không bao giờ biết, khi 'Filename_temp.txt' có thể đã tồn tại. – Nolonar

Trả lời

12

Theo MSDN blog của bài viết How to do atomic writes in a file, đổi tên một tập tin NTFS là một hoạt động nguyên tử:

Các giải pháp? Hãy nhớ rằng thay đổi siêu dữ liệu là nguyên tử. Đổi tên là một trường hợp như vậy. Vì vậy, chúng ta chỉ có thể thực hiện ghi vào một tập tin tạm thời, và sau khi chúng ta biết rằng các ghi được trên đĩa (hoàn thành và đỏ mặt) sau đó chúng ta có thể trao đổi các tập tin cũ với tập tin mới.

Đã cấp, điều này không đảm bảo rằng File.Move chỉ phát hành hoạt động đổi tên NTFS, nhưng tôi không thể nghĩ ra lý do hợp lệ tại sao nó nên làm bất cứ điều gì phức tạp hơn.

+6

Chắc chắn có một lý do: tệp có thể được chuyển sang một thiết bị khác. – PythonNut

3

Tệp.Move phải là 'đổi tên' nếu nguồn và đích nằm trên cùng một ổ đĩa. Vì vậy, bất kể kích thước tập tin, Move nên được 'ngay lập tức'. Tôi đoán đó là mối quan tâm của bạn?

Từ Câu hỏi thường gặp từ nhân viên MS trên http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365240%28v=vs.85%29.aspx chúng tôi có;

'Câu hỏi thường gặp: Là MoveFileEx nguyên tử nếu các tệp hiện tại và mới đều nằm trên cùng một ổ đĩa?

Câu trả lời đơn giản là "thông thường, nhưng trong một số trường hợp, nó sẽ âm thầm quay trở lại phương pháp phi nguyên tử, vì vậy đừng tính vào nó". '

Tôi đoán nếu nó quan trọng 100% bạn có thể xem Giao dịch NTFS. Tôi không chắc chắn nếu có wrappers trong. Net cho điều này được nêu ra, vì vậy bạn có thể cần phải sử dụng P/Invoke.

+0

Chính xác, liệu có được ghi lại ở đâu đó không? –

+0

Không thể tìm thấy bất cứ điều gì vào lúc này, nó là một tính năng của NTFS hơn là. Net mặc dù. Sẽ cố gắng tìm tài liệu tham khảo. –

+0

+1. Dường như có mâu thuẫn với nguồn * từ Microsoft * vào thời điểm này. – Heinzi

0

Bạn có thể ghi tệp của mình trực tiếp đến đích và sử dụng tệp tín hiệu có kích thước bằng không được tạo sau khi tệp lớn sẵn sàng. Quá trình đọc của bạn có thể tìm kiếm tệp tín hiệu và đọc một tệp lớn sau khi tệp tín hiệu khả dụng. Tôi nghĩ rằng có thể giải quyết vấn đề "nguyên tử".

+0

Về cơ bản các tập tin semaphore chỉ ra DONE, tuy nhiên điều này đòi hỏi quá trình xem để thay đổi đó là tiếc là ngoài giới hạn của tôi. –

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