参考
1. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstvolumew
2. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findnextvolumew
3. https://docs.microsoft.com/en-us/windows/win32/fileio/displaying-volume-paths
第一次尝试独立用ctypes调用Windows的api,比较生疏,用了一个半小时左右才搞清楚
注意:该方法只能获取所有有Guid path的卷,部分没有Guid的分区(比如微软保留分区,MSR;以及Linux下的分区,如果你有双系统)都是看不到的,它们只有一个像“\Device\HarddiskVolume5”一样的Device path,我是从DiskGenius上面才看到的。至于怎么获取所有的Device path,我还要继续发掘
直接亮代码吧,不想多说什么
import win32con
import ctypes
from ctypes import wintypes
kernel32 = ctypes.windll.kernel32
lpsz_volume_name = wintypes.LPWSTR("")
cch_buffer_length = wintypes.DWORD(win32con.MAX_PATH)
handle = kernel32.FindFirstVolumeW(lpsz_volume_name, cch_buffer_length)
while True:
# 长度为49,因为GUID的长度是固定的,加上前面的\\?\Volume{和后面的}\,总共长度是49
# 但是官方的C++版本里面也没有写死49
# 但奈何本人没用过C++,只是凭直觉摸索了一点东西
# 毕竟本来长度就是固定的,且凑合着用吧
result = ctypes.wstring_at(lpsz_volume_name, 49)
print(result)
# 继续枚举
success = kernel32.FindNextVolumeW(handle, lpsz_volume_name, cch_buffer_length)
# 如果success为0,即False,说明枚举完了,退出循环
if not success:
break
# 最后一定要关闭
kernel32.FindVolumeClose(handle)