2011-10-11 26 views
7

Tôi đang cố tìm cách giám sát nội dung của thư mục để thay đổi. Tôi đã thử hai cách tiếp cận.Giám sát thư mục trong Cocoa/Cocoa Touch

  1. Sử dụng kqueue giám sát các thư mục
  2. Sử dụng GCD giám sát các thư mục

Vấn đề tôi gặp phải là tôi không thể tìm thấy một cách để phát hiện mà tập tin đã thay đổi. Tôi đang cố gắng theo dõi một thư mục có khả năng hàng ngàn tập tin trong đó và tôi không muốn gọi số liệu thống kê trên mỗi một trong số chúng để tìm ra cái nào đã thay đổi. Tôi cũng không muốn thiết lập một nguồn công văn riêng cho mỗi tệp trong thư mục đó. Điều này có thể thực hiện được không?

Lưu ý: Tôi đã ghi file theo dõi thí nghiệm của tôi với kqueueGCD

+0

Bạn có đang nhắm mục tiêu cả Mac OS X và iOS không? –

+0

Tôi đang nhắm mục tiêu OS X nhưng tôi cũng quan tâm đến việc nó có hoạt động trên iOS hay không. – DHamrick

Trả lời

4

tôi lời khuyên là chỉ cần cắn đạn và làm một thư mục quét trong chủ đề khác, ngay cả khi bạn đang nói về hàng ngàn tập tin. Nhưng nếu bạn nhấn mạnh, đây là câu trả lời:

Không có cách nào để thực hiện việc này mà không cần xắn tay áo và đi lặn hạt nhân.

Tùy chọn đầu tiên của bạn là sử dụng khung FSEvents, sẽ gửi thông báo khi tệp được tạo, chỉnh sửa hoặc xóa (cũng như những việc cần làm với các thuộc tính). Tổng quan là here và ai đó đã viết một Objective C wrapper xung quanh API, mặc dù tôi chưa thử. Nhưng tổng quan không đề cập đến phần về các sự kiện xung quanh tệp thay đổi, chỉ các thư mục (như với kqueue). Tôi đã kết thúc bằng cách sử dụng mã từ here cùng với tệp tiêu đề here để biên dịch nhật ký của riêng tôi mà tôi có thể sử dụng để nhận sự kiện ở cấp tệp riêng lẻ. Bạn sẽ phải viết một số mã trong ứng dụng của mình để chạy trình ghi nhật ký trong nền và theo dõi nó.

Hoặc, hãy xem lệnh "fs_usage", liên tục theo dõi tất cả hoạt động của hệ thống tệp (và tôi có nghĩa là tất cả). Điều này đi kèm với Darwin, vì vậy bạn không phải tự biên dịch nó. Bạn có thể sử dụng kqueue để nghe các thay đổi thư mục, trong khi đồng thời theo dõi đầu ra từ "fs_usage". Nếu bạn nhận được thông báo từ kqueue rằng thư mục đã thay đổi, bạn có thể xem kết quả từ fs_usage, xem tệp nào được ghi vào và kiểm tra tên tệp đối với thư mục đã được sửa đổi. fs_usage là một firehose, vì vậy hãy chuẩn bị để sử dụng một số tùy chọn cùng với Grep để chế ngự nó.

Để mọi thứ trở nên thú vị hơn, cả trình đăng nhập FSEvents và fs_usage đều yêu cầu quyền truy cập gốc, vì vậy bạn sẽ phải được người dùng cấp phép trước khi có thể sử dụng chúng trong ứng dụng OS X của mình (xem Authorization Services Programming Guide để biết thông tin về cách để làm điều đó).

Nếu tất cả điều này nghe có vẻ phức tạp khủng khiếp, đó là vì nó được. Nhưng ít nhất bạn không phải tìm ra con đường khó!

+3

FSE có sẵn trên iOS không? Chương trình iOS có thể chạy một lệnh tùy ý như fs_usage không? –

+0

Đối với iOS, FSEvents sẽ không thực sự cần thiết - vì tất cả các ứng dụng đều được sandbox, không có bất kỳ sự kiện hệ thống tệp nào mà bạn không gây ra cho mình bằng cách làm việc với các tệp trong thư mục Tài liệu. Tôi đã nhìn thấy các ghi chú về iOS5 cho biết bạn có thể sử dụng FSEvents trên hệ thống tệp iCloud.Nếu bạn đang nói về điện thoại * jailbroken * (thì thầm), thì có khả năng là FSEvents có thể bị gửi đi, nhưng tìm kiếm nhanh chóng của Google là không thuyết phục. Tôi nghi ngờ họ đã có một công cụ như fs_usage được xây dựng trong, nhưng bạn có thể biên dịch một mình ... – sgress454

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