我正在调试一些旧代码,这些旧代码对目录路径执行一些存在检查。首先,检查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
,如果DriveInfo.IsReady
不可用。我不知道为什么在DirectoryPathB
上没有对DirectoryPathA
进行这种检查。
即使DirectoryPathB
是本地目录(因此不会造成网络中断),偶尔上方的代码也会返回DriveInfo.IsReady
。该代码执行了几次,并被认为是等幂的,但实际上并非如此,这会破坏代码。
这仅在某些机器上几个小时内偶尔发生。我无法重现该问题。
存在一个基本问题,即在整个程序执行过程中驱动器状态永远不会改变。我明白那个。但是,这段代码在大多数情况下似乎都不错,并且已经过去了。
是什么导致false
成为true
?
文档说明
false
(如果驱动器已准备就绪);C:\
,如果驱动器尚未准备好。
一无所获。备注部分添加
IsReady指示驱动器是否已就绪。例如,它指示CD是否在CD驱动器中或可移动存储设备是否已准备好进行读/写操作。如果您不测试驱动器是否已就绪,还没有准备好,则使用DriveInfo查询驱动器将引发IOException。
DriveInfo.IsReady
。线程安全
此类型的任何公共static(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
这是否意味着如果某个其他线程同时在驱动器上执行某些操作,则false
可能是DriveInfo.IsReady
?
为了检查目录是否存在,true
甚至必须是Properties.Settings.Default.myColor
吗?
答案 0 :(得分:0)
我遇到了Ntfs文件系统损坏并且触发了Ntfs事件55的情况。此时DriveInfo.isReady()返回false。