2010-10-06 25 views
7

Tôi đang sử dụng pyinotify để xem thư mục khi tệp được tạo trong đó. Và khi một số tệp được tạo, tôi muốn di chuyển chúng. Vấn đề là ngay sau khi tập tin được tạo ra (rõ ràng), chương trình của tôi cố gắng di chuyển nó, ngay cả trước khi nó hoàn toàn được ghi vào đĩa.Sử dụng pyinotify để xem để tạo tệp, nhưng đợi cho nó được ghi hoàn toàn vào đĩa

Có cách nào để làm cho pyinotify chờ cho đến khi một tệp hoàn toàn được ghi vào đĩa trước khi thông báo cho tôi rằng tệp đã được tạo chưa? Hoặc là có bất kỳ cách dễ dàng để, sau khi tôi được thông báo, làm cho python chờ đợi để di chuyển nó cho đến khi nó được thực hiện được viết?

Trả lời

14

Có pyinotify phản ứng với IN_CLOSE_WRITE sự kiện:

wm.add_watch(watched_dir, pyinotify.IN_CLOSE_WRITE, proc_fun=MyProcessEvent()) 

Đây là từ man 5 incrontab, nhưng nó áp dụng tốt như nhau để pyinotify:

IN_ACCESS   File was accessed (read) (*) 
    IN_ATTRIB   Metadata changed (permissions, timestamps, extended attributes, etc.) (*) 
    IN_CLOSE_WRITE  File opened for writing was closed (*) 
    IN_CLOSE_NOWRITE File not opened for writing was closed (*) 
    IN_CREATE   File/directory created in watched directory (*) 
    IN_DELETE   File/directory deleted from watched directory (*) 
    IN_DELETE_SELF   Watched file/directory was itself deleted 
    IN_MODIFY   File was modified (*) 
    IN_MOVE_SELF  Watched file/directory was itself moved 
    IN_MOVED_FROM  File moved out of watched directory (*) 
    IN_MOVED_TO   File moved into watched directory (*) 
    IN_OPEN    File was opened (*) 
+1

Lưu ý rằng điều này sẽ bắt các sửa đổi, cũng như các sáng tạo (nếu bạn đang phản chiếu thư mục có thể là hành vi mong muốn). Nếu bạn chỉ muốn kích hoạt khi phát hiện các tệp * mới *, bạn sẽ cần một trình xử lý tùy chỉnh theo dõi các sự kiện 'IN_CREATE' và sau đó đợi chúng hoàn thành (thông qua xem các sự kiện' IN_CLOSE_WRITE'). – TimStaley

1

Rất khó để nói ở cấp độ này nếu tệp đang được ghi vào. Những gì bạn có thể làm là kiểm tra xem một tập tin có được mở bởi một tiến trình nào khác không.

1) Từ các cờ khác nhau được sử dụng trong khi mở tệp, cờ O_EXLOCK có thể trợ giúp. Nếu cờ O_EXLOCK được đặt, bộ mô tả tệp có khóa độc quyền trên tệp. Vì vậy, sự hiểu biết của tôi là nếu bạn có thể làm os.open() với cờ O_EXLOCK, nó không mở bởi quá trình khác. Điều này sẽ hoạt động trên tất cả các hệ điều hành tương thích với posix nhưng tôi chưa thử nghiệm nó. Nếu tệp mở, bạn có thể đóng, đợi và thử lại.

2) Bạn cũng có thể thử os.stat và xem thay đổi dấu thời gian và cố gắng diễn giải thông tin một cách an toàn. Mặc dù đây không phải là bằng chứng ngu ngốc.

3) Trên các hệ thống unix, bạn có thể thử "lsof"

4) Các trang sau đây mô tả sử dụng symlink từ/proc/PID/fd để kiểm tra cho các tập tin mở

[Edit: Liên kết được cập nhật]

1

Nếu bạn có quyền kiểm soát của quá trình viết , bạn có thể gọi tập tin "foo.part" trong khi nó đang được viết và đổi tên thành "foo" khi nó đã bị đóng.

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