gpt4 book ai didi

c# - 是什么导致 DriveInfo.IsReady 为假?

转载 作者:行者123 更新时间:2023-11-30 12:55:09 25 4
gpt4 key购买 nike

情况

我正在调试一些对目录路径执行一些存在性检查的遗留代码。首先,检查 DirectoryPathA 并返回它(如果存在)。这应该是通常的情况。如果失败,将检查并返回 DirectoryPathB。 (如果那也失败了,就会发生其他事情,而不是这个问题的一部分)。代码如下所示:

if (!string.IsNullOrEmpty(DirectoryPathA))
{
driveInfo = new DriveInfo(DirectoryPathA);
if (driveInfo.IsReady)
{
dInf = new DirectoryInfo(DirectoryPathA);
if (dInf.Exists)
{
return DirectoryPathA;
}
}
}

if (!string.IsNullOrEmpty(DirectoryPathB))
{
dInf = new DirectoryInfo(DirectoryPathB);
if (dInf.Exists)
{
return DirectoryPathB;
}
}

如您所见,第一个检查有一个基于 DriveInfo.IsReady 的额外守卫.之前网络上的文件访问存在问题,所以我的假设是(同样,这是遗留代码)引入它是为了建立 DirectoryPathB 作为 DirectoryPathA 的替代方案不可用。我不知道为什么没有对 DirectoryPathB 执行这样的 DriveInfo.IsReady 检查。

问题

即使 DirectoryPathA 是本地目录(因此不会出现网络中断),上面的代码偶尔 会返回 DirectoryPathB。该代码被执行了几次,并被认为是幂等的,但事实并非如此,这会破坏事情。这只会在几个小时的过程中偶尔在某些机器上发生。我无法重现该问题。

驱动器状态在整个程序执行过程中永远不会改变的假设存在一个根本问题。我明白那个。然而,这段代码似乎大部分时间都没有问题,并且已经过去了。

问题

什么会导致 DriveInfo.IsReadyfalse

文档说明

true if the drive is ready; false if the drive is not ready.

什么都不感谢。备注部分添加

IsReady indicates whether a drive is ready. For example, it indicates whether a CD is in a CD drive or whether a removable storage device is ready for read/write operations. If you do not test whether a drive is ready, and it is not ready, querying the drive using DriveInfo will raise an IOException.

  • 它不是可移动驱动器。我们说的是普通的 C:\
  • 这不是权限问题,因为对于同一用户它有时有效有时无效。
  • 这不是驱动器因省电模式而变得不可用的问题,因为
    • 省电模式未激活并且
    • 这是一个固态硬盘。

The old documentation指出

Thread Safety

Any public static ( Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

这是否意味着如果其他线程同时在驱动器上执行某些操作,DriveInfo.IsReady 可能为 falseDriveInfo.IsReady 是否必须为 true 才能检查目录是否存在?

最佳答案

我遇到了 Ntfs 文件系统损坏并触发了 Ntfs 事件 55 的情况。此时DriveInfo.isReady()返回false。

关于c# - 是什么导致 DriveInfo.IsReady 为假?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51149329/

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