I have a list of valid drive letters, and I want to present a choice to the end user. I'd like to show them the names of the drives. Here's some code that should show me the name of drive 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
However, this outputs \\?\Volume{a8b6b3df-1a63-11e1-9f6f-0007e9ebdfbf}\
. How can I get the string that windows shows in explorer (eg, KINGSTON
, for a certain flash drive I own)?
Still not working:
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)
)
This gives me this error:
WindowsError: exception: access violation reading 0x3A353FA0
Why don't you use win32api.GetVolumeInformation?
import win32api
win32api.GetVolumeInformation("C:\\")
outputs
('WINDOWS', 1992293715, 255, 65470719, 'NTFS')
Try the GetVolumeInformation
function instead. It returns the volume label directly.
Using the above fragment, I filled in the missing(optional, null) arguments as a quick helper:
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
This should be copy-and-paste-able.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With