Как я могу получить название диска в Python - PullRequest
5 голосов
/ 30 ноября 2011

У меня есть список допустимых букв дисков, и я хочу представить выбор конечному пользователю. Я хотел бы показать им названия дисков. Вот некоторый код, который должен показать мне имя диска 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

Однако, это выводит \\?\Volume{a8b6b3df-1a63-11e1-9f6f-0007e9ebdfbf}\. Как я могу получить строку, которую Windows показывает в проводнике (например, KINGSTON, для определенной моей флешки)?


EDIT:

Все еще не работает:

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)
)

Это дает мне эту ошибку:

WindowsError: exception: access violation reading 0x3A353FA0

Ответы [ 5 ]

6 голосов
/ 30 ноября 2011

Попробуйте использовать функцию GetVolumeInformation.Возвращает метку тома напрямую.

5 голосов
/ 04 апреля 2013

Почему бы вам не использовать win32api.GetVolumeInformation?

import win32api
win32api.GetVolumeInformation("C:\\")

вывод

('WINDOWS', 1992293715, 255, 65470719, 'NTFS')
3 голосов
/ 21 августа 2012

Используя приведенный выше фрагмент, я заполнил отсутствующие (необязательные, нулевые) аргументы в качестве быстрого помощника:

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

Это должно быть с возможностью копирования и вставки.

1 голос
/ 05 июля 2019
  • возвращает driveLetter для данного driveLabel
  • возвращает notfound, если driveLabel не был найден

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"
1 голос
/ 03 июля 2018

Вы можете выполнить командную оболочку Windows и проанализировать вывод.

import subprocess 
def getDriveName(driveletter):
    return subprocess.check_output(["cmd","/c vol "+driveletter]).split("\r\n")[0].split(" ").pop()

print getDriveName("d:")

Работает в Python 2.7

...