J’ai une liste de lettres de lecteur valides et je souhaite présenter un choix à l’utilisateur final. Je voudrais leur montrer les noms des lecteurs. Voici un code qui devrait me montrer le nom du lecteur 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
Cependant, cela \\?\Volume{a8b6b3df-1a63-11e1-9f6f-0007e9ebdfbf}\
. Comment puis-je obtenir la chaîne que Windows affiche dans l’explorateur (par exemple, KINGSTON
, pour un certain lecteur flash que je possède)?
Ne fonctionne toujours pas:
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) )
Cela me donne cette erreur:
WindowsError: exception: access violation reading 0x3A353FA0
Essayez GetVolumeInformation
fonction GetVolumeInformation
. Il renvoie directement l’étiquette de volume.
Pourquoi n’utilisez-vous pas win32api.GetVolumeInformation?
import win32api win32api.GetVolumeInformation("C:\\")
les sorties
('WINDOWS', 1992293715, 255, 65470719, 'NTFS')
En utilisant le fragment ci-dessus, j’ai rempli les arguments manquants (facultatifs, null) comme une aide rapide:
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
Cela devrait pouvoir être copié-collé.
Vous pouvez exécuter Windows Shell cmd et parsingr le résultat.
import subprocess def getDriveName(driveletter): return subprocess.check_output(["cmd","/c vol "+driveletter]).split("\r\n")[0].split(" ").pop() print getDriveName("d:")
Cela fonctionne dans Python 2.7