Как проверить, находится ли диск в диске, использующем python?
Скажем, я хочу управлять некоторыми файлами на дисководе или USB-картридере. Как проверить, готов ли диск, о котором идет речь? (То есть физически вставлен диск.)
Буква диска Существует, поэтому ОС.exists () всегда возвращает True в этом случае. Кроме того, на данном этапе процесса я еще не знаю никаких имен файлов, поэтому проверка, чтобы увидеть, существует ли данный файл, также не будет работать.
Некоторое уточнение: проблема здесь заключается в обработке исключений. Большинство из них вызовы win32 API, о которых идет речь, просто создают исключение при попытке получить доступ к диску, который не готов. Обычно это работает нормально-найдите что-то вроде свободного пространства, а затем поймайте вызванное исключение и предположите, что это означает, что диска нет. Однако, даже когда я ловлю все исключения, я все равно получаю сердитое диалоговое окно исключения из Windows, сообщающее мне, что устройство чтения дискет / карт не готово. Итак, я думаю, что реальный вопрос - как мне подавить ошибку windows коробка?
5 ответов:
И ответ, как и на многие другие вопросы, оказывается, содержится в статье о программировании C++ / Win32 десятилетней давности .
Проблема, в двух словах, заключается в том, что Windows обрабатывает ошибки гибких дисков несколько иначе, чем другие типы ошибок дисков. По умолчанию, независимо от того, что делает ваша программа, или думает , что она делает, Windows перехватит любые ошибки, вызванные устройством, и представит пользователю диалоговое окно, вместо того чтобы позволить программе обработать его-точное проблема, которая у меня была. Но, как оказалось, есть вызов Win32 API для решения этой проблемы, в первую очередьSetErrorMode()В двух словах (и я размахиваю здесь множеством деталей), мы можем использовать
SetErrorMode(), чтобы заставить Windows перестать быть таким параноиком, сделать свое дело и позволить программе справиться с ситуацией, а затем сбросить режим ошибок Windows обратно к тому, что было раньше, как будто мы никогда не были там. (Вероятно, здесь есть шутка Кейзера Созе, но я выпил неправильное количество кофеина сегодня, чтобы иметь возможность найти его.)Адаптация примера кода C++ из связанной статьи, который выглядит примерно так:
int OldMode; //a place to store the old error mode //save the old error mode and set the new mode to let us do the work: OldMode = SetErrorMode(SEM_FAILCRITICALERRORS); // Do whatever we need to do that might cause an error SetErrorMode(OldMode); //put things back the way they wereВ C++ для правильного обнаружения ошибок требуется функция' GetLastError ()', о которой нам, к счастью, не нужно беспокоиться, так как это вопрос Python. В нашем случае обработка исключений Python работает нормально. Это, значит, функция, которую я собрал вместе, чтобы проверить букву диска на "готовность", все готово для копирования-вставки, если кому-то еще нужно это:
import win32api def testDrive( currentLetter ): """ Tests a given drive letter to see if the drive is question is ready for access. This is to handle things like floppy drives and USB card readers which have to have physical media inserted in order to be accessed. Returns true if the drive is ready, false if not. """ returnValue = False #This prevents Windows from showing an error to the user, and allows python #to handle the exception on its own. oldError = win32api.SetErrorMode( 1 ) #note that SEM_FAILCRITICALERRORS = 1 try: freeSpace = win32file.GetDiskFreeSpaceEx( letter ) except: returnValue = False else: returnValue = True #restore the Windows error handling state to whatever it was before we #started messing with it: win32api.SetErrorMode( oldError ) return returnValueЯ использую его довольно много в последние несколько дней, и он прекрасно работает как для дискет, так и для USB-картридеров.
Несколько примечаний: практически любая функция, нуждающаяся в доступе к диску, будет работать в блоке try-все, что мы ищем в исключении из-за отсутствия носителя.
Кроме того, в то время как пакет python
Я надеюсь, что это поможет кому-то еще с подобной проблемой!win32apiпредоставляет все необходимые нам функции, он, похоже, не имеет ни одной из констант флага. После путешествия в древние недра MSDN, оказывается, что SEM_FAILCRITICALERRORS равно 1, что делает нашу жизнь ужасно легкой.
Вы можете сравнить
len(os.listdir("path"))с нулем, чтобы увидеть, есть ли какие-либо файлы в каталоге.
Если у вас есть pythonwin, помогает ли какая-либо информация в этом рецепте?
На первый взгляд, "доступность" и "статус" могут быть достойны внимания. Или вы можете проверить имя Тома, которое, я думаю, будет либо " X:", либо " если в диске ничего нет. Или, черт возьми, ищите свободное пространство или общее количество блоков.
Вы можете использовать функции win32 через превосходный pywin32 (http://sourceforge.net/projects/pywin32/) для этой цели.
Я предлагаю посмотреть на функцию
В качестве альтернативы вы можете наблюдать за изменениями каталога или файла с помощью функцииGetDiskFreeSpace. Вы можете проверить свободное место на целевом диске и продолжить, основываясь на этой информации.ReadDirectoryChangesW. Вы будете получать уведомления об изменениях файлов и т.д. Но вы должны проверить, работает ли это для вас или нет. Вы можете посмотреть на этот пример для себя: http://timgolden.me.uk/python/downloads/watch_directory.py
Не уверен насчет вашей платформы, но SNMP может быть ответом для вас.
Comments