请不要删除这个答案,如果我做错了什么,请给我留下评论的机会来纠正它。谢谢!
有一种比遍历所有PID(如评论中建议的那样)更好的方法,它涉及执行Windows API调用以确定给定文件上的所有句柄。请查看下面的代码示例,我已经为另一个问题发布过(但是,由于它没有任何被接受的答案,因此无法标记为重复)。请注意,这仅适用于Windows。
import ctypes
from ctypes import wintypes
path = r"C:\temp\stackoverflow39570207.txt"
ntdll = ctypes.WinDLL('ntdll')
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
NTSTATUS = wintypes.LONG
INVALID_HANDLE_VALUE = wintypes.HANDLE(-1).value
FILE_READ_ATTRIBUTES = 0x80
FILE_SHARE_READ = 1
OPEN_EXISTING = 3
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
FILE_INFORMATION_CLASS = wintypes.ULONG
FileProcessIdsUsingFileInformation = 47
LPSECURITY_ATTRIBUTES = wintypes.LPVOID
ULONG_PTR = wintypes.WPARAM
kernel32.CreateFileW.restype = wintypes.HANDLE
kernel32.CreateFileW.argtypes = (
wintypes.LPCWSTR,
wintypes.DWORD,
wintypes.DWORD,
LPSECURITY_ATTRIBUTES,
wintypes.DWORD,
wintypes.DWORD,
wintypes.HANDLE)
hFile = kernel32.CreateFileW(
path, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, None, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, None)
if hFile == INVALID_HANDLE_VALUE:
raise ctypes.WinError(ctypes.get_last_error())
class IO_STATUS_BLOCK(ctypes.Structure):
class _STATUS(ctypes.Union):
_fields_ = (('Status', NTSTATUS),
('Pointer', wintypes.LPVOID))
_anonymous_ = '_Status',
_fields_ = (('_Status', _STATUS),
('Information', ULONG_PTR))
iosb = IO_STATUS_BLOCK()
class FILE_PROCESS_IDS_USING_FILE_INFORMATION(ctypes.Structure):
_fields_ = (('NumberOfProcessIdsInList', wintypes.LARGE_INTEGER),
('ProcessIdList', wintypes.LARGE_INTEGER * 64))
info = FILE_PROCESS_IDS_USING_FILE_INFORMATION()
PIO_STATUS_BLOCK = ctypes.POINTER(IO_STATUS_BLOCK)
ntdll.NtQueryInformationFile.restype = NTSTATUS
ntdll.NtQueryInformationFile.argtypes = (
wintypes.HANDLE,
PIO_STATUS_BLOCK,
wintypes.LPVOID,
wintypes.ULONG,
FILE_INFORMATION_CLASS)
status = ntdll.NtQueryInformationFile(hFile, ctypes.byref(iosb),
ctypes.byref(info),
ctypes.sizeof(info),
FileProcessIdsUsingFileInformation)
pidList = info.ProcessIdList[0:info.NumberOfProcessIdsInList]
print(pidList)
psutil
模块。 - acw1668psutil.Process(pid).open_files()
,其中pid
可以从psutil.pids()
获取。您还可以使用psutil.process_iter()
循环遍历所有进程。 - acw1668open_files()
总是返回[]
。但在Linux中它是有效的。 - acw1668