确定是否可以在NTFS上移动目录

时间:2010-07-18 11:22:57

标签: c# .net file winapi ntfs

我有一个目录,其中包含复杂的子目录树中的大量文件。

如果我尝试将该目录移动到同一分区上的另一个目录中,理论上该操作可能需要一段时间 - 基本上是重命名操作。 - 只要源目录中没有任何文件正在使用且没有安全问题,对吧?

如果是这样,我如何以编程方式告诉是否可以将目录A移动到B?

是否有任何与锁定相关的API可以帮助我解决这个问题?

我在NTFS分区上使用C#。

2 个答案:

答案 0 :(得分:4)

在多任务操作系统上不存在这种“可以工作”的API。它们本身就不可靠,比如检查文件是否被锁定。这样的测试可以返回“未锁定”,然后您的线程可以被抢占,另一个进程中的另一个线程可以锁定该文件。当你的线程重新获得CPU时,你会发现该文件已被锁定,即使测试表明它没有。

执行此操作的唯一方法是实际执行操作,然后查找错误以指示无法执行此操作。 C#中的一个例外,使用 try 语句来捕获IOException。这并不容易处理,但至少NTFS允许您重命名或移动被锁定的文件。

答案 1 :(得分:2)

有很多东西可以让你的移动操作失败:

  • 目录中的文件已锁定
  • 您没有B
  • 的书面许可
  • 您没有A的写入权限(复制工作但不能移动)
  • 您拥有A的写入权限,但不是
  • 中的每个文件
  • 数据损坏(损坏的硬盘)
  • 有人已经移动了该文件夹

在制作过程中,你可能还会想到更多。

无论如何,NTFS支持自Vista / 2008以来的事务,因此您可以将任务包装在TransactionScope中:

以下是关于此的文章:http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

这里有一个很棒的教程:community.bartdesmet.net