2010-04-24 25 views

Trả lời

49

Nguyên tử nói chung có nghĩa là hoạt động không thể bị gián đoạn sẽ hoàn thành hoặc không có hiệu lực. Khi viết tệp, điều đó được thực hiện bằng cách ghi vào một tệp tạm thời, sau đó thay thế tệp gốc bằng tạm thời khi quá trình ghi hoàn tất.

Sự cố khi viết tệp nguyên tử có nghĩa là bản gốc không bị sửa đổi và có tệp rác có thể bị xóa. Một sự cố khi viết bình thường có nghĩa là một tệp tin tốt được mong đợi bị hỏng.

Hiệu suất khôn ngoan chi phí là tối thiểu. Trong quá trình viết, bạn sẽ có hai bản sao của một tập tin. Thay thế tệp là một thao tác rất đơn giản ở cấp hệ thống tệp.

Chỉnh sửa: cảm ơn zneak

+6

Nguyên tử thay vì có nghĩa là hoạt động diễn ra hoàn toàn hoặc không hoàn toàn. Nó có thể bị gián đoạn hoặc ngừng hoặc tiếp tục, nó sẽ không thay đổi trạng thái của hệ thống cho đến khi nó hoàn thành. Mặc dù, kết luận vẫn giữ nguyên. – zneak

+0

Tôi sẽ không cụm từ này là "bạn sẽ có hai bản sao của một tập tin" vì nó quá dễ dàng để đọc đó là có nghĩa là hai bản sao của cùng một dữ liệu chính xác, đó không phải là những gì đang xảy ra. –

0

Hệ thống tệp không phải sử dụng để viết/đổi tên chu kỳ viết nguyên tử. Hệ thống tệp có ngữ nghĩa khóa cho phép bạn 'khóa' các phần hoặc tất cả tệp, hoặc trong một số trường hợp thậm chí làm những việc như nối thêm vào một tệp, để trợ giúp với nguyên tử.

@Randy, cả hai giả định của bạn về phân mảnh có thể sai. Trên hầu hết các hệ thống tập tin, việc viết toàn bộ tệp và đóng tệp sẽ dẫn đến tệp bị phân mảnh ít hơn và việc ghi một tệp lớn trong một lần ghi duy nhất chắc chắn sẽ dẫn đến việc sử dụng khối lớn hơn. Nếu bạn có nghĩa là các khối tập tin có nhiều khả năng 'leo' trên đĩa, điều đó phụ thuộc vào sở thích bố trí trong hệ thống tập tin của bạn. Nếu bạn đang viết thư cho flash, bạn có thể muốn hệ thống tập tin nhảy qua kho lưu trữ có sẵn như là một loại tự san lấp mặt bằng của các ghi.

0

Viết nguyên tử mất nhiều bước hơn - tệp phụ trợ bổ sung được tạo. Lớp NSString Reference giải thích:

Nếu CÓ, người nhận được ghi vào tệp phụ và sau đó đổi tên tệp phụ thành đường dẫn. Nếu KHÔNG, người nhận được viết trực tiếp vào đường dẫn. Tùy chọn YES đảm bảo đường dẫn đó, nếu nó tồn tại ở tất cả, sẽ không bị hỏng ngay cả khi hệ thống bị lỗi trong khi viết .

Dưới đây là ví dụ trong trường hợp của plists:

[array writeToFile:path atomically:YES]; 

khi "YES", sau đó plist được cập nhật chỉ một lần ngay cả khi bạn chạy các mã nhiều lần trong XCode,

[array writeToFile:path atomically:NO]; 

khi "KHÔNG" nó được cập nhật nhiều khi bạn chạy cùng một mã (cập nhật lặp lại).

+0

không có lý do tại sao một số người downvoted câu trả lời mà không có bất kỳ lời giải thích. –

+1

Tôi nghĩ bởi vì họ tin rằng bạn không nên dựa vào những phức tạp không có giấy tờ của một API để khắc phục các lỗi lập trình nghiêm trọng. – malhal

+0

Cảm ơn nhận xét, tôi đã giải thích thêm. –

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