有没有办法在所有硬盘驱动器上进行文件观察?
Is there a way to file watcher on all hard disk drives?
我有一个脚本来检测使用 win32file
API 和 python
在硬盘驱动器上创建的一些文件
from win32file import CreateFile, ReadDirectoryChangesW
import win32con
def Watcher():
ExtensionScan = ['exe', 'dll', 'vbs', 'com', 'jar']
FILE_LIST_DIRECTORY = 0x0001
path_to_watch = "c:\"
hDir = CreateFile(
path_to_watch,
FILE_LIST_DIRECTORY,
win32con.FILE_SHARE_READ |
win32con.FILE_SHARE_WRITE |
win32con.FILE_SHARE_DELETE,
None,
win32con.OPEN_EXISTING,
win32con.FILE_FLAG_BACKUP_SEMANTICS,
None
)
while True:
Results = ReadDirectoryChangesW (
hDir,
1024,
True,
win32con.FILE_NOTIFY_CHANGE_FILE_NAME |
win32con.FILE_NOTIFY_CHANGE_DIR_NAME |
win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES |
win32con.FILE_NOTIFY_CHANGE_SIZE |
win32con.FILE_NOTIFY_CHANGE_LAST_WRITE |
win32con.FILE_NOTIFY_CHANGE_SECURITY,
None,
None
)
for Action, File in Results:
FullPath = "{}\{}".format(path_to_watch, File).lower()
Extension = FullPath.split('.')[-1]
if Action == 1 and Extension in ExtensionScan:
Name = FullPath.split('\')[-1]
print({FullPath: {"Name": Name, "Extension": Extension}})
此代码有效,但我希望所有硬盘上的 watcher 不是特定路径
path_to_watch = "c:\"
我有一个想法,通过对所有驱动器进行线程化来使用特定驱动器调用 Watcher(drive="D:\")
,如下面的代码:
Drives = ["C:\", "D:\", "E:\"]
for i in Drives:
Thread(target=Watcher, args=(i,).start()
但此解决方案不利于处理器性能
最后,有没有办法在 win32file
中构建此解决方案或使用我的想法?
谢谢大家
def Watcher(_disk):
ExtensionScan = ['exe', 'dll', 'vbs', 'com', 'jar']
FILE_LIST_DIRECTORY = 0x0001
path_to_watch = _disk
...
for i in Drives:
Thread(target=Watcher(i)
我有一个脚本来检测使用 win32file
API 和 python
from win32file import CreateFile, ReadDirectoryChangesW
import win32con
def Watcher():
ExtensionScan = ['exe', 'dll', 'vbs', 'com', 'jar']
FILE_LIST_DIRECTORY = 0x0001
path_to_watch = "c:\"
hDir = CreateFile(
path_to_watch,
FILE_LIST_DIRECTORY,
win32con.FILE_SHARE_READ |
win32con.FILE_SHARE_WRITE |
win32con.FILE_SHARE_DELETE,
None,
win32con.OPEN_EXISTING,
win32con.FILE_FLAG_BACKUP_SEMANTICS,
None
)
while True:
Results = ReadDirectoryChangesW (
hDir,
1024,
True,
win32con.FILE_NOTIFY_CHANGE_FILE_NAME |
win32con.FILE_NOTIFY_CHANGE_DIR_NAME |
win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES |
win32con.FILE_NOTIFY_CHANGE_SIZE |
win32con.FILE_NOTIFY_CHANGE_LAST_WRITE |
win32con.FILE_NOTIFY_CHANGE_SECURITY,
None,
None
)
for Action, File in Results:
FullPath = "{}\{}".format(path_to_watch, File).lower()
Extension = FullPath.split('.')[-1]
if Action == 1 and Extension in ExtensionScan:
Name = FullPath.split('\')[-1]
print({FullPath: {"Name": Name, "Extension": Extension}})
此代码有效,但我希望所有硬盘上的 watcher 不是特定路径
path_to_watch = "c:\"
我有一个想法,通过对所有驱动器进行线程化来使用特定驱动器调用 Watcher(drive="D:\")
,如下面的代码:
Drives = ["C:\", "D:\", "E:\"]
for i in Drives:
Thread(target=Watcher, args=(i,).start()
但此解决方案不利于处理器性能
最后,有没有办法在 win32file
中构建此解决方案或使用我的想法?
谢谢大家
def Watcher(_disk):
ExtensionScan = ['exe', 'dll', 'vbs', 'com', 'jar']
FILE_LIST_DIRECTORY = 0x0001
path_to_watch = _disk
...
for i in Drives:
Thread(target=Watcher(i)