How can I get the name of a drive in python
Question:
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)?
EDIT:
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
Answers:
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.
Why don’t you use win32api.GetVolumeInformation?
import win32api
win32api.GetVolumeInformation("C:\")
outputs
('WINDOWS', 1992293715, 255, 65470719, 'NTFS')
You can execute windows shell cmd and parse the output.
in Python 3.x:
import subprocess
def getDriveName(driveletter):
return subprocess.check_output(["cmd","/c vol "+driveletter]).decode().split("rn")[0].split(" ").pop()
print (getDriveName("d:"))
in Python 2.7:
import subprocess
def getDriveName(driveletter):
return subprocess.check_output(["cmd","/c vol "+driveletter]).split("rn")[0].split(" ").pop()
print getDriveName("d:")
- returns driveLetter for the given driveLabel
- returns “notfound” if driveLabel was not found
def findDriveByDriveLabel(driveLabel):
drvArr = ['c:', 'd:', 'e:', 'f:', 'g:', 'h:', 'i:', 'j:', 'k:', 'l:']
for dl in drvArr:
try:
if (os.path.isdir(dl) != 0):
val = subprocess.check_output(["cmd", "/c vol " + dl])
if (driveLabel in str(val)):
return dl + "/"
except:
print("Error: findDriveByDriveLabel(): exception")
return "notfound"
You can below code to get your drive name if you find useful
import win32api
import win32con
import win32file
def get_removable_drives():
drives = [i for i in win32api.GetLogicalDriveStrings().split('x00') if i]
#print(drives)
rdrives = [d for d in drives if win32file.GetDriveType(d) == win32con.DRIVE_REMOVABLE]
return rdrives
drive_list = get_removable_drives()
for i in drive_list:
print(win32api.GetVolumeInformation(i)[0]+'('+i+')')
import win32api
import win32file
drives = win32api.GetLogicalDriveStrings()
drives = drives.split(' 00')[:-1]
for drive in drives:
if win32file.GetDriveType(drive)==win32file.DRIVE_REMOVABLE:
label,fs,serial,c,d = win32api.GetVolumeInformation(drive)
print(label)
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)?
EDIT:
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
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.
Why don’t you use win32api.GetVolumeInformation?
import win32api
win32api.GetVolumeInformation("C:\")
outputs
('WINDOWS', 1992293715, 255, 65470719, 'NTFS')
You can execute windows shell cmd and parse the output.
in Python 3.x:
import subprocess
def getDriveName(driveletter):
return subprocess.check_output(["cmd","/c vol "+driveletter]).decode().split("rn")[0].split(" ").pop()
print (getDriveName("d:"))
in Python 2.7:
import subprocess
def getDriveName(driveletter):
return subprocess.check_output(["cmd","/c vol "+driveletter]).split("rn")[0].split(" ").pop()
print getDriveName("d:")
- returns driveLetter for the given driveLabel
- returns “notfound” if driveLabel was not found
def findDriveByDriveLabel(driveLabel):
drvArr = ['c:', 'd:', 'e:', 'f:', 'g:', 'h:', 'i:', 'j:', 'k:', 'l:']
for dl in drvArr:
try:
if (os.path.isdir(dl) != 0):
val = subprocess.check_output(["cmd", "/c vol " + dl])
if (driveLabel in str(val)):
return dl + "/"
except:
print("Error: findDriveByDriveLabel(): exception")
return "notfound"
You can below code to get your drive name if you find useful
import win32api
import win32con
import win32file
def get_removable_drives():
drives = [i for i in win32api.GetLogicalDriveStrings().split('x00') if i]
#print(drives)
rdrives = [d for d in drives if win32file.GetDriveType(d) == win32con.DRIVE_REMOVABLE]
return rdrives
drive_list = get_removable_drives()
for i in drive_list:
print(win32api.GetVolumeInformation(i)[0]+'('+i+')')
import win32api
import win32file
drives = win32api.GetLogicalDriveStrings()
drives = drives.split(' 00')[:-1]
for drive in drives:
if win32file.GetDriveType(drive)==win32file.DRIVE_REMOVABLE:
label,fs,serial,c,d = win32api.GetVolumeInformation(drive)
print(label)