2012-06-26 22 views
11

Tôi muốn theo dõi một thư mục (trong số hàng ngàn tệp, với khoảng 5 cấp độ thư mục con) khi tệp được thay đổi. Tôi biết tôi có thể sử dụng API FSEvents để theo dõi một thư mục khi các tệp thay đổi bên trong thư mục đó, nhưng tôi dường như không thể tìm ra cách để xác định (các) tệp đã thay đổi. Tham chiếu This gợi ý tôi xây dựng một cây nhị phân và đi ngang qua cây mỗi khi một sự kiện được kích hoạt, có phải là cách tốt nhất để xác định tệp nào đã được thay đổi không? Nếu không, một số thay đổi là tốt hơn là gì?Xem thư mục để thay đổi tập tin

Tốt hơn là đệ quy quét thư mục và đính kèm kqueue vào mọi tệp? Tôi không chắc nó hoạt động tốt như thế nào trên hàng ngàn tập tin?

Trả lời

8

Tôi đã sử dụng UKKQueue trước đây với kết quả hỗn hợp.

Gần đây tôi đã nhận thức được một giải pháp tốt hơn, nhưng tôi chưa thử điều này. Nếu bạn chỉ cần nhắm mục tiêu đến Lion, tôi nghĩ rằng cách thực hành tốt nhất mới để thực hiện việc này là sử dụng NSFileCoordinator. Bạn thực hiện các phương thức của NSFilePresenter để chỉ ra thư mục nào bạn quan tâm (thuộc tính presentedItemURL) và hệ thống sẽ thông báo cho bạn khi một mục con di chuyển/thay đổi/bị xóa (thông qua các phương thức như presentedSubitemDidChangeAtURL:)

Tôi muốn yêu để nghe nó hoạt động như thế nào nếu bạn đi theo con đường đó.

+0

Jesse, bạn đã thử sử dụng NSFileCoordinator/NSFilePresenter để thực hiện giám sát một số thư mục cho đến nay chưa? Tôi đã không thể làm cho giải pháp này hoạt động - nó chỉ đơn giản là không thông báo cho tôi về bất kỳ sự kiện nào. –

+0

@DaveNewman NSFileCoordinator chỉ hoạt động nếu chương trình đang thực hiện thay đổi cũng đang sử dụng nó. (nghĩa là nó là một API chọn tham gia) Hầu hết các chương trình Ca cao sẽ làm điều này; những thay đổi mà bạn thấy đang được thực hiện bởi API cấp thấp hơn, có lẽ là gì? –

+0

Tôi không hiểu. Ví dụ, tôi đã tạo ra một người trình bày tập tin cho thư mục của tôi, nói, '/ Users/Dave/MyFolder'. Bây giờ khi tôi thả các tập tin vào thư mục này (kéo và thả), chỉ có phương thức 'presentationSubitemDidChangeAtURL:' đang được gọi bởi hệ thống, nhưng không phải là 'presentationSubitemDidAppearAtURL:'. Nó cũng không gọi 'accommodPresentedSubitemDeletionAtURL' khi tôi xóa một số tệp trong Trình tìm kiếm. Tôi đã bỏ lỡ bất cứ điều gì? –

6

Nếu bạn tạo luồng của mình bằng cách sử dụng kFSEventStreamCreateFlagFileEvents thì bạn sẽ nhận được sự kiện cho các thay đổi đối với mỗi tệp thay vì chỉ thông báo về thay đổi đối với thư mục đã xem. Rất tiếc, tính năng này chỉ khả dụng trong OSX 10.7 trở lên.