假设我想操作软盘驱动器或USB读卡器上的某些文件。如何查看相关驱动器是否准备就绪? (也就是说,有一个物理插入的磁盘。)
驱动器号存在,因此在这种情况下,os.exists()将始终返回True。此外,在此过程中我还不知道任何文件名,因此检查给定文件是否存在也不起作用。
一些澄清:这里的问题是异常处理。当您尝试访问未准备好的驱动器时,大多数有问题的win32 API调用只会引发异常。通常情况下,这样可以正常工作 - 查找类似于自由空间的内容,然后捕获引发的异常,并假设这意味着没有磁盘存在。然而,即使我发现任何和所有异常,我仍然从Windows得到一个愤怒的异常对话框告诉我软盘/读卡器没有准备好。所以,我想真正的问题是 - 如何抑制Windows错误框?
答案 0 :(得分:7)
答案就像许多事情一样,最终出现在an article about C++/Win32 programming from a decade ago。
简而言之,问题在于Windows处理软盘错误的方式与其他类型的驱动器错误略有不同。默认情况下,无论您的程序是什么,或者认为它正在做什么,Windows都会拦截设备抛出的任何错误,并向用户提供一个对话框,而不是让程序处理它 - 确切的问题我有。
但是,事实证明,有一个Win32 API调用来解决这个问题,主要是SetErrorMode()
简而言之(我正在努力解决这里的许多细节),我们可以使用SetErrorMode()
让Windows停止变得如此偏执,做我们的事情并让程序处理这种情况,然后将Windows错误模式重置为之前的状态,就像我们从未去过那里一样。 (这里可能有一个Keyser Soze的笑话,但我今天的咖啡因含量错误,无法找到它。)
调整链接文章中的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,这让我们的生活变得非常简单。
我希望这可以帮助其他有类似问题的人!
答案 1 :(得分:4)
您可以将len(os.listdir("path"))
与零进行比较,以查看目录中是否有任何文件。
答案 2 :(得分:1)
如果你有pythonwin,this recipe中的任何信息都有帮助吗?
猜测,“可用性”和“状态”可能值得关注。或者您可以测试卷名称,如果驱动器中没有任何内容,我猜这将是“X:”或“”。或者,哎呀,寻找可用空间或总块数。
答案 3 :(得分:1)
为此,您可以通过优秀的pywin32(http://sourceforge.net/projects/pywin32/)使用win32函数。
我建议查看GetDiskFreeSpace
函数。您可以检查目标驱动器上的可用空间,并根据该信息继续。
作为替代方案,您可以使用ReadDirectoryChangesW
功能查看目录或文件的更改。您将收到有关文件更改等的通知。但您必须检查这是否适合您。你可以看看这个例子:
http://timgolden.me.uk/python/downloads/watch_directory.py
答案 4 :(得分:0)
不确定您的平台,但SNMP可能是您的答案。