gpt4 book ai didi

python - 如何检查磁盘是否在使用 python 的驱动器中?

转载 作者:可可西里 更新时间:2023-11-01 13:50:54 24 4
gpt4 key购买 nike

假设我想操作软盘驱动器或 USB 读卡器上的一些文件。如何检查有问题的驱动器是否准备就绪? (即物理插入磁盘。)

驱动器盘符存在,因此在这种情况下 os.exists() 将始终返回 True。此外,在这个过程中,我还不知道任何文件名,因此检查给定文件是否存在也不起作用。

一些澄清:这里的问题是异常处理。大多数有问题的 win32 API 调用只是在您尝试访问未就绪的驱动器时抛出异常。通常,这会很好地工作 - 寻找类似可用空间的东西,然后捕获引发的异常并假设这意味着不存在磁盘。然而,即使我捕捉到所有异常,我仍然会收到来自 Windows 的异常对话框,告诉我软盘/读卡器尚未准备好。所以,我想真正的问题是 - 如何抑制 Windows 错误框?

最佳答案

和很多事情一样,答案就在 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 block 中运行 - 我们正在寻找由于媒体不存在而导致的异常。

此外,虽然 python win32api 包公开了我们需要的所有函数,但它似乎没有任何标志常量。在访问了 MSDN 的古老内部之后,发现 SEM_FAILCRITICALERRORS 等于 1,这让我们的生活变得非常轻松。

我希望这能帮助遇到类似问题的其他人!

关于python - 如何检查磁盘是否在使用 python 的驱动器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/851010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com