Python3调用GetVolumeInformationW获取磁盘信息及解析文件系统标识方法
原代码错误修正方案
你原来的代码返回None是因为GetVolumeInformationW的serial_number、max_component_length、file_system_flags属于输出参数,Win32 API要求传入对应数据类型的指针来接收返回值,直接传入Python的None变量无法被API写入数据。
修正后的完整代码如下:
import ctypes from ctypes import wintypes kernel32 = ctypes.windll.kernel32 # 定义输出缓冲区 volumeNameBuffer = ctypes.create_unicode_buffer(1024) fileSystemNameBuffer = ctypes.create_unicode_buffer(1024) # 定义三个输出参数为DWORD类型,初始值为0 serial_number = wintypes.DWORD() max_component_length = wintypes.DWORD() file_system_flags = wintypes.DWORD() target_disk = 'C:\\' # 调用API时用byref传变量指针 rc = kernel32.GetVolumeInformationW( ctypes.c_wchar_p(target_disk), volumeNameBuffer, ctypes.sizeof(volumeNameBuffer), ctypes.byref(serial_number), ctypes.byref(max_component_length), ctypes.byref(file_system_flags), fileSystemNameBuffer, ctypes.sizeof(fileSystemNameBuffer) ) if rc == 0: # 调用失败可以打印错误码 print(f"调用失败,错误码:{ctypes.get_last_error()}") else: mount_point = target_disk[:-1] disk_label = volumeNameBuffer.value fs_type = fileSystemNameBuffer.value max_length = max_component_length.value flags = file_system_flags.value serial = serial_number.value print(mount_point, disk_label, fs_type, max_length, flags, serial)
修改点说明:
- 引入了
wintypes模块直接使用Windows标准的DWORD类型定义三个输出参数 - 调用API时使用
ctypes.byref()传入三个变量的指针,让API可以把返回值写入对应内存地址 - 取值时通过
.value属性拿到Python可以直接处理的数值
文件系统标识转可读格式方案
你可以直接通过按位与运算匹配每个标识位,把命中的可读字符串收集起来即可,实现代码如下:
def flags_to_str(flags): hex_flags = [0x00000002, 0x00000001, 0x20000000, 0x00000010, 0x00040000, 0x00000008, 0x00080000, 0x00100000, 0x00020000, 0x00800000, 0x00400000, 0x00010000, 0x01000000, 0x00000080, 0x00000040, 0x00200000, 0x02000000, 0x00000004, 0x00008000, 0x00000020, 0x08000000] str_flags = ['FILE_CASE_PRESERVED_NAMES', 'FILE_CASE_SENSITIVE_SEARCH', 'FILE_DAX_VOLUME', 'FILE_FILE_COMPRESSION', 'FILE_NAMED_STREAMS', 'FILE_PERSISTENT_ACLS', 'FILE_READ_ONLY_VOLUME', 'FILE_SEQUENTIAL_WRITE_ONCE', 'FILE_SUPPORTS_ENCRYPTION', 'FILE_SUPPORTS_EXTENDED_ATTRIBUTES', 'FILE_SUPPORTS_HARD_LINKS', 'FILE_SUPPORTS_OBJECT_IDS', 'FILE_SUPPORTS_OPEN_BY_FILE_ID', 'FILE_SUPPORTS_REPARSE_POINTS', 'FILE_SUPPORTS_SPARSE_FILES', 'FILE_SUPPORTS_TRANSACTIONS', 'FILE_SUPPORTS_USN_JOURNAL', 'FILE_UNICODE_ON_DISK', 'FILE_VOLUME_IS_COMPRESSED', 'FILE_VOLUME_QUOTAS', 'FILE_SUPPORTS_BLOCK_REFCOUNTING'] result = [] for hex_flag, str_flag in zip(hex_flags, str_flags): if flags & hex_flag: result.append(str_flag) return result # 用法示例,比如你拿到的flags是0x3e706ff print(flags_to_str(0x3e706ff))
运行后会返回当前文件系统支持的所有特性的可读字符串列表。
内容的提问来源于stack exchange,提问作者Mrkalvin Bs
相关产品推荐
相关产品推荐

