2015-06-15 1 views
1

Как проверить, существует ли в python жесткий диск (Windows)? то есть «\\. \ PhysicalDriveN», где N в номере дискаКак проверить, существует ли в Python Raw (размонтированный) диск Windows

Теперь я могу проверить, существует ли необработанный диск (как администратор), открыв и сразу же закрыв его. Если есть исключение, тогда необработанное устройство может не существовать, иначе это произойдет. Я знаю, что это не очень 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") 
+1

Вы можете использовать ctypes для вызова ['QueryDosDeviceW'] (https://msdn.microsoft.com/en-us/library/aa365461). Если существует символическая ссылка устройства DOS, это получает цель в пространстве имен объектов NT, например. '\\? \ PhysicalDrive0' =>' \ Device \ Harddisk0 \ DR0'. – eryksun

+0

Например: 'target = (ctypes.c_wchar * 32768)();' 'target_len = ctypes.windll.kernel32.QueryDosDeviceW (u'PhysicalDrive0 ', target, len (target))'. – eryksun

+0

@eryksun Если я правильно понял, вы говорите, что '\\. \ PhysicalDrive0' является символической ссылкой? Было бы проще проверить некоторые '\ Device \ Harddisk0'? Эта функция работает, хотя –

ответ

2

Как eryksun отметил в комментариях, ctypes.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 струнами Юникода по умолчанию, поэтому QueryDosDeviceW (выше) работает. Для Python 2, ctypes.windll.kernel32.QueryDosDeviceA будет работать вместо QueryDocDeviceW для байтовых строк.