2013-05-03 17 views
5

AFAIK, OS X là một dẫn xuất BSD, không có khóa tệp bắt buộc thực sự. Nếu có, có vẻ như tôi không có cách nào để ngăn việc truy cập bằng văn bản từ các chương trình khác ngay cả khi tôi đang viết một tệp.Làm thế nào để đảm bảo tính toàn vẹn của tệp mà không cần khóa tệp bắt buộc trên OS X?

Làm thế nào để đảm bảo tính toàn vẹn tệp trong môi trường như vậy? Tôi không quan tâm đến tính toàn vẹn sau khi chương trình của tôi đã thoát, bởi vì đó là trách nhiệm của người dùng. Nhưng ít nhất, tôi nghĩ rằng tôi cần một số loại bảo đảm trong khi chương trình của tôi đang chạy.

Làm cách nào để các chương trình khác đảm bảo tính toàn vẹn nội dung tệp mà không cần khóa bắt buộc? Đặc biệt là chương trình cơ sở dữ liệu. Nếu có kỹ thuật chung hoặc thực hành được khuyến nghị, vui lòng cho tôi biết.

Cập nhật

Tôi đang tìm kiếm này cho lớp dữ liệu của ứng dụng GUI cho người dùng không kỹ sư. Và hiện tại, chương trình của tôi có những tình huống này.

  • Dữ liệu quá lớn nên không thể phù hợp với RAM. Và thậm chí khó có thể được sao chép tạm thời. Vì vậy, nó không thể được đọc/ghi nguyên tử, và nên được sử dụng từ đĩa trực tiếp trong khi chương trình đang chạy.

  • Ứng dụng trình soạn thảo nội dung GUI chuyên nghiệp dài chạy được sử dụng bởi những người không phải là kỹ sư. Mặc dù người dùng không phải là kỹ sư, nhưng họ vẫn có thể truy cập tệp đồng thời với Trình tìm kiếm hoặc các chương trình khác. Vì vậy, người dùng có thể xóa hoặc viết trên tập tin hiện đang sử dụng vô tình. Vấn đề là người dùng không hiểu những gì đang thực sự xảy ra, và mong đợi chương trình xử lý toàn vẹn tập tin ít nhất là chương trình đang chạy.

  • Tôi nghĩ rằng cách duy nhất để đảm bảo tính toàn vẹn của tập tin trong tình hình hiện nay là,

    1. mở tập tin với khóa bắt buộc độc quyền trên toàn hệ thống. Bây giờ tập tin là trách nhiệm của chương trình.
    2. Kiểm tra tính toàn vẹn.
    3. Sử dụng tệp như bộ nhớ ngoài trong khi chương trình đang chạy.
    4. Viết tất cả các sửa đổi.
    5. Mở khóa. Bây giờ tập tin là trách nhiệm của người dùng.

    Vì OS X thiếu khóa bắt buộc trên toàn hệ thống nên hiện tại tôi không biết phải làm gì cho việc này. Nhưng tôi vẫn tin rằng có một cách để lưu trữ loại tệp toàn vẹn này, điều mà tôi không biết. Và tôi muốn biết mọi người xử lý chuyện này ra sao.

Câu hỏi này không phải về lỗi lập trình của tôi. Đó là một vấn đề khác. Vấn đề hiện tại là bảo vệ dữ liệu từ các chương trình khác không tôn trọng việc khóa tập tin tư vấn. Ngoài ra, người dùng thường là người chủ và chương trình đang chạy với cùng một người dùng, vì vậy đặc quyền tệp Unix tầm thường không hữu ích.

+0

Bạn đã xem xét khả năng ẩn tệp đơn giản mà bạn đang làm việc cho đến khi bạn hoàn thành nó chưa? –

+0

@KenThomases Có vẻ như một giải pháp tốt nếu tôi có thể ẩn hiện đang sử dụng tệp từ các quy trình khác. Bạn có thể cho tôi biết phương pháp cụ thể không? – Eonil

Trả lời

1

Dưới đây là một số chi tiết về chủ đề này: https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileCoordinators/FileCoordinators.html

Bây giờ tôi nghĩ rằng chính sách cơ bản trên OSX là một cái gì đó như thế này.

  • Luôn cho phép truy cập theo bất kỳ quy trình nào.
  • Luôn sẵn sàng cho đột biến tệp dữ liệu được chia sẻ.
  • Được thông báo khi các quy trình khác thay đổi nội dung tệp và cung cấp phản hồi thích hợp cho chúng. Ví dụ: bạn có thể hiển thị lỗi cho người dùng cuối nếu quá trình khác đang cố truy cập tệp. Và sau đó người dùng sẽ học được điều đó là xấu, và sẽ không làm điều đó một lần nữa.
4

Bạn phải xem xét vấn đề mà bạn đang cố thực sự giải quyết bằng khóa bắt buộc.

Tính toàn vẹn nội dung tệp không được đảm bảo bằng khóa bắt buộc; trừ khi bạn giữ tập tin của bạn bị khóa 24/7; tính toàn vẹn của tệp sẽ vẫn phụ thuộc vào tất cả các quy trình quan sát định dạng tệp/quy ước truy cập (và vẫn có thể bị lỗi do lỗi ổ đĩa cứng, v.v.).

Khóa bắt buộc nào bảo vệ bạn là lỗi lập trình (do tai nạn, không phải do lỗi) không tôn trọng các giao thức khóa thích hợp. Đồng thời, sự bảo vệ đó chỉ là một phần, vì không có được một khóa (bắt buộc hay không) vẫn có thể dẫn đến việc hỏng tệp. Khóa bắt buộc cũng có thể giảm đồng thời có thể nhiều hơn mức cần thiết. Trong ngắn hạn, bắt buộc khóa cung cấp bảo vệ nhiều hơn so với khóa tư vấn chống lại các lỗi phần mềm, nhưng việc bảo vệ không hoàn thành.

Một giải pháp cho vấn đề tham nhũng tình cờ là sử dụng thư viện được kiểm tra tích cực để duy trì tính toàn vẹn dữ liệu. Một thư viện như vậy (có những thư viện khác) là SQlite (xem thêm herehere để biết thêm thông tin). Trên OS X, Core Data cung cấp lớp trừu tượng trên SQLite làm lưu trữ dữ liệu. Rõ ràng, cách tiếp cận như vậy nên được bổ sung bằng cách sao chép/sao lưu để bạn có được sự bảo vệ chống lại các nguyên nhân khác gây hỏng dữ liệu, nơi lớp lưu trữ không thể giúp bạn (lỗi truyền thông, xóa tình cờ).

Bảo vệ bổ sung có thể đạt được bằng cách hạn chế quyền truy cập tệp vào cơ sở dữ liệu và chỉ cho phép truy cập thông qua cổng (chẳng hạn như ổ cắm hoặc thư viện tin nhắn). Sau đó, bạn sẽ chỉ có một quá trình duy nhất chạy mà chỉ mua lại một khóa (và không bao giờ phát hành nó). Thiết lập này khá dễ dàng để kiểm tra; khóa chỉ đơn thuần là ngăn chặn có nhiều hơn một thể hiện của quá trình cổng đang chạy.

3

Một giải pháp đơn giản là chỉ cần ẩn tệp khỏi người dùng cho đến khi chương trình của bạn được thực hiện bằng cách sử dụng nó.

Có nhiều cách khác nhau để ẩn tệp. Nó phụ thuộc vào việc bạn đang sửa đổi một tập tin hiện có mà trước đó có thể nhìn thấy cho người dùng hoặc tạo một tập tin mới. Ngay cả khi sửa đổi một tệp hiện có, tốt nhất bạn nên tạo một bản sao làm việc ẩn và sau đó trao đổi nguyên tử nội dung của nó với tệp có thể hiển thị cho người dùng.

Một cách tiếp cận để ẩn tệp là tạo một cách tiếp cận để ẩn tệp ở vị trí không phải là bình thường hiển thị với người dùng. (Đó là, nó không phải là cần thiết rằng các tập tin hoàn toàn không thể cho người sử dụng để đạt được, chỉ cần ra khỏi con đường để họ sẽ không vấp ngã trên nó.) Bạn có thể có được một vị trí như vậy bằng cách sử dụng -[NSFileManager URLForDirectory:inDomain:appropriateForURL:create:error:] và đi qua NSItemReplacementDirectoryNSUserDomainMask cho hai thông số đầu tiên. Xem phương pháp -replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error: để biết cách di chuyển tệp một cách nguyên tử vào vị trí tệp của nó.

Bạn có thể đặt tệp bị ẩn bằng các API khác nhau. Bạn có thể sử dụng -[NSURL setResourceValue:forKey:error:] bằng khóa NSURLIsHiddenKey. Bạn có thể sử dụng cuộc gọi hệ thống chflags() để đặt UF_HIDDEN. Chế độ chờ cũ của Unix là sử dụng tên tệp bắt đầu bằng dấu chấm ('.').

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