如何检查Python中是否存在原始(未安装)Windows驱动器

时间:2015-06-15 23:45:21

标签: python windows block-device

如何检查python中是否存在原始(Windows)驱动器?即“\\。\ PhysicalDriveN”,其中磁盘号为N

现在我可以通过打开并立即关闭它来检查原始驱动器是否存在(作为管理员)。如果存在异常,则原始设备可能不存在,否则可能存在。我知道这不是非常pythonic。还有更好的方法吗?

os.access(drive_name, os.F_OK)始终返回False。与os.path.exists(drive_name)相同。我更喜欢使用python标准库。 os.stat(drive_name)无法找到该设备。

我的工作代码示例:

drive_name = r"\\.\PhysicalDrive1"
try:
    open(drive_name).close()
except FileNotFoundError:
    print("The device does not exist")
else:
    print("The device exists")

2 个答案:

答案 0 :(得分:2)

在评论中指出eryksunctypes.windll.kernel32.QueryDosDeviceW可用于测试设备符号链接是否存在(PhysicalDrive1是指向实际设备位置的符号链接)。 ctypes模块允许用户通过动态链接库访问此API函数。

QueryDosDeviceW要求将驱动器名称作为字符串,字符数组和字符数组的长度。字符数组存储驱动器名称映射到的原始设备。该函数返回存储在字符数组中的字符数,如果驱动器不存在则为零。

import ctypes
drive_name = "PhysicalDrive1"
target = (ctypes.c_wchar * 32768)(); # Creates an instance of a character array
target_len = ctypes.windll.kernel32.QueryDosDeviceW(drive_name, target, len(target))
if not target_len:
     print("The device does not exist")
else:
     print("The device exists")

target字符数组对象可能存储了值"\Device\Harddisk2\DR10"

注意 在python 3中,默认情况下字符串是unicode,这就是QueryDosDeviceW(上面)工作的原因。对于Python 2,ctypes.windll.kernel32.QueryDosDeviceA代替QueryDocDeviceW用于字节字符串。

答案 1 :(得分:0)

不导入ctypes等。

os.path.exists("C:")

正常工作。驱动程序参数应带有尾随的“:”字符。

>>> os.path.exists("C:")
True
>>> os.path.exists("D:")
True
>>> os.path.exists("A:")
False
>>> os.path.exists("X:")
True  # i have mounted a local directory here
>>> os.path.exists("C")
False  # without trailing ":"