Chào mn ạ, em đang học về python. thầy của em đang ra một đề đó là kiểm tra trạng thái tập tin đó. khi ai đó mở tập tin đó lên thì sẽ phát cảnh báo(không chỉnh sửa gì luôn ạ). Ai cho em gợi ý về cách check thời gian mở tập tin đi ạ. Em cảm ơn mn ạ.
Thắc mắc về bắt sự kiện trong python
Poll cái file đó thôi (tức là mở ra thử xong đóng lại và check error)
có thể giải thích rõ thêm giúp em không ạ @@ tại em cũng mới học python @@
Python standard library không có cho filesystem events.
1 là bạn có thể tạo vòng lặp kiểm tra lần cuối cùng file bị sửa, cách này chỉ phát hiện được khi file bị sửa chứ không phải khi được mở. Design pattern này có thể xem ở đây
2 là b có thể viết plugin bằng c/c++ bắt sự kiện filesystem events và wrapper cho Python, đã có thư viện là watchdog
Windows thì m mù tịt.
Em cảm ơn ạ, em có xem cái watchdog nhưng chỉ thấy nó cho bắt sự kiện, chỉnh sửa, xoá, đổi tên tập tin @@ khổ cái đề của thầy ghê @@
Có vẻ phức tạp và low-level hơn mình nghĩ.
Hiện tại m chỉ nghĩ được sử dụng api của inotify, ví dụ đơn giản có thể thử bằng inotify-tools
File đc mở bằng cái gì nhỉ? Trên hệ điều hành nào mỗi hệ điều hành có hệ thống file system api riêng.
p/s: https://stackoverflow.com/questions/11114492/check-if-a-file-is-not-open-not-used-by-other-process-in-python
import psutil
def has_handle(fpath):
for proc in psutil.process_iter():
try:
for item in proc.open_files():
if fpath == item.path:
return True
except Exception:
pass
return False
em cũng đang coi pyinotify ko biết nó là một với inotify hả bác ? @@
dạ mở bằng notepad bình thường thôi ạ, em đang học python cơ bản thôi ạ.
M ko sài windows nên ko test đc
Trên mac sài vscode mở file để test hàm kia thì ok nha
làm sao thế ạ, em có bạn sài mac :v
Bạn chạy vòng lặp với delay 200ms với hàm has_handle bên trên là đc mà.
Pyinotify là 1 wrapper của inotify.
Sử dụng filesytem event thì có vẻ phức tạp nhưng là event driven nên chắc scale tốt hơn, cách của @Dao_An là phù hợp nếu bạn không quan tâm nhiều đến performance.
Em cảm ơn các bác đã chỉ giúp em ạ :v em đã làm bằng cách dùng pyinotify, các bác cho em hỏi thêm cái sự kiện Close_NoWrite ý nghĩa của nó là sao ạ ? tại khi chạy thử pyinotify thì em chỉ mới mở tập tin lên thì nó hiện thông báo sự kiện Open_File và kèm theo cả cái Close_NoWrite, mn giúp em giải thích cái sự kiện này với ạ, em cảm ơn ạ.
https://linux.die.net/man/1/inotifywatch
A watched file or a file within a watched directory was closed, after being opened in read-only mode.
bác có thể giải thích rõ hơn cho em xíu được không ạ @@ em nghiệm nãy giờ vẫn chưa hiểu ra rõ ạ @@
Có thể ban đầu file được mở lên chỉ để đọc, sau khi chương trình thấy cần ghi đè lên thì mới đóng rồi mở lại để ghi.
em xin lỗi bác nhưng thực sự em ko hiểu chỗ này ạ @@ bác cho em xin một ví dụ dc không ạ em cảm ơn ạ.
Cho mình hỏi: Bạn mở tập tin bằng gì??
dạ em mở bằng Text Editor ạ