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

wmvff8tz  于 2023-01-27  发布在  Windows
关注(0)|答案(7)|浏览(189)

我有一个有效驱动器号的列表,我想向最终用户提供一个选择。我想向他们显示驱动器的名称。下面的一些代码应该会向我显示驱动器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,对于我拥有的某个闪存驱动器)?

编辑:

仍然不工作:

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
anauzrmj

anauzrmj1#

为什么不使用win32api.GetVolumeInformation呢?

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

产出

('WINDOWS', 1992293715, 255, 65470719, 'NTFS')
rdrgkggo

rdrgkggo2#

尝试GetVolumeInformation函数,它直接返回卷标。

2skhul33

2skhul333#

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

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

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

p1tboqfb

p1tboqfb4#

  • 返回给定驱动器的driveLetter标签
  • 如果未找到driveLabel,则返回“notfound

def查找驱动器按驱动器标签(驱动器标签):

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"
vxf3dgd4

vxf3dgd45#

您可以执行windows shell cmd并解析输出。
在Python 3.x中:

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

print (getDriveName("d:"))

在Python 2.7中:

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

print getDriveName("d:")
zyfwsgd6

zyfwsgd66#

你可以在下面的代码,以获得您的驱动器名称,如果你觉得有用

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+')')
n6lpvg4x

n6lpvg4x7#

导入win32 api导入win32 file驱动器= win32api.GetLogicalDriveStrings()驱动器=驱动器.split('\000')[:-1]
对于驱动器中的驱动器:如果win32file.GetDriveType(驱动器)== win32file.驱动器可移除:标签,文件系统,串行,c,d = win32api.GetVolumeInformation(获取卷信息)打印(标签)

相关问题