假设我想操作软盘驱动器或USB读卡器上的某些文件.如何查看相关驱动器是否准备就绪?(也就是说,有一个物理插入的磁盘.)
驱动器号存在,因此在这种情况下os.exists()将始终返回True.此外,在此过程中我还不知道任何文件名,因此检查给定文件是否存在也不起作用.
一些澄清:这里的问题是异常处理.当您尝试访问未准备好的驱动器时,大多数有问题的win32 API调用只会引发异常.通常情况下,这样可以正常工作 - 查找类似于自由空间的内容,然后捕获引发的异常,并假设这意味着没有磁盘存在.然而,即使我发现任何和所有异常,我仍然从Windows得到一个愤怒的异常对话框告诉我软盘/读卡器没有准备好.所以,我想真正的问题是 - 如何抑制Windows错误框?
答案就像许多事情一样,在十年前的一篇关于C++/Win32编程的文章中也是如此.
简而言之,问题在于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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
在过去的几天里,我一直在使用它,它在软盘和USB读卡器上都运行得非常好.
一些注意事项:几乎任何需要磁盘访问的功能都可以在try块中工作 - 由于介质不存在,我们在异常中寻找所有功能.
此外,虽然python win32api包公开了我们需要的所有函数,但它似乎没有任何标志常量.在访问MSDN的古老之后,事实证明SEM_FAILCRITICALERRORS等于1,这使我们的生活变得非常简单.
我希望这可以帮助其他有类似问题的人!
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |