You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:06:03