有没有一种方法可以立即检查一个目录是否正在使用?

11

我想使用Directory.Move移动一个目录及其所有子目录。

但在此之前,我想检查该目录及其子目录中的所有文件和子文件是否正在被其他进程使用。

然后,在移动之前,我想锁定该目录以防止其他进程访问,以确保Directory.Move不会抛出任何异常。

如何最好地实现这一点?

我希望避免逐个文件检查使用情况,因为当软件检查文件时,文件未被使用并不意味着在移动过程开始时它不会被使用。


我添加了一个Windows标签。你能更具体地说明你正在使用哪个版本的Windows吗? - DOK
我使用的是Windows 7,但我希望这个程序能够在尽可能多的Windows版本上运行。 - Arsen Zahray
1
我想不出一个现实的场景,因为文件锁定而导致失败。这不是Windows的工作方式,重命名被锁定的文件不是问题。如果您实际上将目录移动到另一个驱动器,则可能会出现问题。因此,请改用Copy(),然后再删除。 - Hans Passant
2个回答

9
无法锁定文件夹(包括子文件夹),因此您始终会遇到竞争条件,并且不能保证没有异常情况发生。
在检查和移动之间,总是存在某些变化的可能性,因此可能会出现问题。
如果移动文件夹不成功,请稍后重试。
另请参阅:Delphi:检查文件是否正在使用(这是一个类似的问题,请忽略Delphi部分)

2

描述

您可以将文件操作放入try..catch块中,并捕获IOException异常。

示例

try 
{
   // try to move
} 
catch (System.IO.IOException ex) 
{
   // file used by another process or other IO Exception
}

更多信息


考虑到您正在使用 .Net 4+,您还可以使用 Task.Delay(new TimeSpan(0, 0, 0, 5)).ContinueWith((o) => WatchDogOnCreated(this, fileSystemEventArgs)); 与您的代码结合使用(放置在 catch 子句中 - 这确实是非常关键的代码,但我发现这个方法可行。至少它是一个解决方法。 - SharpShade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接