如何在python中获取驱动器的名称

Eri*_*ric 5 python windows ctypes

我有一个有效的驱动器号列表,我想向最终用户提供一个选择.我想向他们展示驱动器的名称.这里有一些代码可以显示驱动器的名称F:\:

import ctypes

kernel32 = ctypes.windll.kernel32
buf = ctypes.create_unicode_buffer(1024)

kernel32.GetVolumeNameForVolumeMountPointW(
    ctypes.c_wchar_p("F:\\"),
    buf,
    ctypes.sizeof(buf)
)

print buf.value
Run Code Online (Sandbox Code Playgroud)

但是,这个输出\\?\Volume{a8b6b3df-1a63-11e1-9f6f-0007e9ebdfbf}\.如何获取Windows在资源管理器中显示的字符串(例如KINGSTON,对于我拥有的某个闪存驱动器)?


编辑:

还是行不通:

volumeNameBuffer = ctypes.create_unicode_buffer(1024)
fileSystemNameBuffer = ctypes.create_unicode_buffer(1024)

kernel32.GetVolumeInformationW(
    ctypes.c_wchar_p("C:\\"),
    volumeNameBuffer,
    ctypes.sizeof(volumeNameBuffer),
    fileSystemNameBuffer,
    ctypes.sizeof(fileSystemNameBuffer)
)
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

WindowsError: exception: access violation reading 0x3A353FA0
Run Code Online (Sandbox Code Playgroud)

小智 7

你为什么不使用win32api.GetVolumeInformation?

import win32api
win32api.GetVolumeInformation("C:\\")
Run Code Online (Sandbox Code Playgroud)

输出

('WINDOWS', 1992293715, 255, 65470719, 'NTFS')
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 6

请尝试使用该GetVolumeInformation功能.它直接返回卷标.


小智 6

使用上面的片段,我填写了缺少的(可选的,空的)参数作为快速助手:

import ctypes
kernel32 = ctypes.windll.kernel32
volumeNameBuffer = ctypes.create_unicode_buffer(1024)
fileSystemNameBuffer = ctypes.create_unicode_buffer(1024)
serial_number = None
max_component_length = None
file_system_flags = None

rc = kernel32.GetVolumeInformationW(
    ctypes.c_wchar_p("F:\\"),
    volumeNameBuffer,
    ctypes.sizeof(volumeNameBuffer),
    serial_number,
    max_component_length,
    file_system_flags,
    fileSystemNameBuffer,
    ctypes.sizeof(fileSystemNameBuffer)
)

print volumeNameBuffer.value
print fileSystemNameBuffer.value
Run Code Online (Sandbox Code Playgroud)

这应该是可复制和粘贴的。