Chủ đề nói rằng tất cả - cách dễ dàng và đa nền tảng là bình chọn, thông minh. Nhưng mọi hệ điều hành đều có một số phương tiện để thông báo mà không cần bỏ phiếu. Có thể trong một cách nền tảng hợp lý chéo? (Tôi chỉ thực sự quan tâm đến Windows và Linux, nhưng tôi sử dụng mac, vì vậy tôi nghĩ rằng posix có thể giúp đỡ?)Cách được thông báo về thay đổi tập tin/thư mục trong C/C++, lý tưởng nhất là sử dụng POSIX
Trả lời
người dùng Linux có thể sử dụng inotify
inotify là một hạt nhân Linux hệ thống phụ cung cấp sự kiện hệ thống tập tin thông báo.
Một số goodies cho đồng loại Windows:
Tôi không nghĩ rằng POSIX chính nó có cơ sở cho điều đó. Gần nhất với cross-nền tảng tôi đã nhìn thấy là FAM, mà dường như làm việc cho Linux, BSD, và Irix, nhưng tôi không phải là cách dễ dàng nó sẽ được cổng nó vào Windows và MacOS.
Tôi tin rằng OS X hiện có móc/callbacks thích hợp vì chúng cần thiết cho việc lập chỉ mục Spotlight.
Trên linux, bạn sẽ gặp phải sự cố thêm rằng có nhiều hệ thống tệp thường được sử dụng. Nếu bạn cần các chức năng cho một số lượng hạn chế của các tập tin/thư mục, tôi muốn cố gắng chủ động tìm kiếm các sửa đổi đều đặn.
Thư viện Qt có một lớp QFileSystemWatcher cung cấp thông báo đa nền tảng khi một tập tin thay đổi. Ngay cả khi bạn không sử dụng Qt, bởi vì nguồn có sẵn, bạn có thể xem nó như là một mẫu để thực hiện riêng của bạn. Qt có các triển khai riêng cho Windows, Linux và Mac.
Có
File System Events API
tính từ Leopard.
Tôi đã thực sự xây dựng hệ thống này trước khi sử dụng trong cơ sở mã C++ thương mại miễn là bạn không cần mọi thứ kỳ lạ dưới ánh nắng mặt trời, hệ thống Windows và POSIX có nhiều chồng chéo bạn có thể trừu tượng.
POSIX: Sử dụng inotify- toàn bộ hệ thống được tạo theo nghĩa đen cho công việc này
Windows: Sử dụng "sự kiện thay đổi". Bạn phải xây dựng thêm keo và tự báo cáo (tất cả các API bạn cần có sẵn, chỉ có không phải là việc mua sắm 1-stop-inotify mang lại cho bạn).
Những điều phổ biến bạn có thể phát hiện trong "chuỗi thông báo" của mình để chuyển tiếp sự kiện là:
1) Về cơ bản bất kỳ hoạt động xâm nhập nào được hỗ trợ, với (có thể) ngoại lệ sửa đổi quyền. Đây là những thứ như di chuyển, tạo, xóa, sao chép các thư mục và tệp.
2) Đọc và ghi vào tệp (viết riêng). Lưu ý rằng nếu bạn đang sử dụng I/O không đồng bộ, thông báo có thể hiển thị không đúng thứ tự.
3) Khi có ổ đĩa mới, chẳng hạn như ai đó đang kết nối ổ flash.
inotify đặc biệt cung cấp cho bạn mức độ kiểm soát chi tiết điên rồ, Windows ít hơn. Với inotify bạn theo nghĩa đen có thể theo dõi tất cả mọi thứ hệ thống tập tin đang làm trong thời gian gần như thực nếu bạn thực sự muốn. Tôi biết # 3 là có thể với cả hai mà không cần bỏ phiếu, nhưng lưu ý rằng nó có thể được thực sự khôn lanh để làm cho nó hoạt động chính xác- trên một trong hai hệ thống.
vâng tôi đã có thể làm cho nó hoạt động cho điều đó. Một chút kỳ lạ của nó, với một khối đọc() - nhưng ít nhất có độ trễ bằng không (thay vào đó, không có polling!). –