Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定是否可以在NTFS上移动目录_C#_.net_File_Winapi_Ntfs - Fatal编程技术网

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

C# 确定是否可以在NTFS上移动目录,c#,.net,file,winapi,ntfs,C#,.net,File,Winapi,Ntfs,我有一个目录,在一个复杂的子目录树中包含许多文件 如果我尝试将该目录移动到同一分区上的另一个目录中,理论上该操作可能需要恒定的时间-基本上是重命名操作。-只要源目录中没有任何文件正在使用,并且没有安全问题,对吗 如果是这样,我如何通过编程告诉您是否可以将目录A移动到B 是否有任何与锁定相关的API可以帮助我实现这一点 我在NTFS分区上使用C#。在多任务操作系统上不存在这种“可以工作”的API。它们本质上是不可靠的,比如检查文件是否被锁定。这样的测试可能会返回“notlock”,然后您的线程可能

我有一个目录,在一个复杂的子目录树中包含许多文件

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

如果是这样,我如何通过编程告诉您是否可以将目录A移动到B

是否有任何与锁定相关的API可以帮助我实现这一点

我在NTFS分区上使用C#。

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

要做到这一点,唯一的方法是实际执行该操作,然后查找错误以指示不可能执行该操作。在C#中出现异常时,使用try语句捕获IOException。不是很容易处理,但至少NTFS允许您重命名或移动已锁定的文件。

在多任务操作系统上不存在此类“是否可行”API。它们本质上是不可靠的,比如检查文件是否被锁定。这样的测试可能会返回“notlock”,然后您的线程可能会被抢占,而另一个进程中的另一个线程可能会锁定该文件。当你的线程重新获得CPU时,你会发现文件被锁定,即使测试说它没有被锁定


要做到这一点,唯一的方法是实际执行该操作,然后查找错误以指示不可能执行该操作。在C#中出现异常时,使用try语句捕获IOException。不是很容易处理,但至少NTFS允许您重命名或移动已锁定的文件。

有很多事情会让您的移动操作失败:

  • 目录中的文件已锁定
  • 您没有对B的写入权限
  • 您没有对的写入权限(可以复制但不能移动)
  • 您有对的写入权限,但不是对其中的每个文件都有写入权限
  • 数据损坏(硬盘损坏)
  • 有人已经移动了那个文件夹
在生产过程中,你可能不会想到更多

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

以下是一篇关于这方面的文章:


这里有一个很棒的教程:

有很多东西会让移动操作失败:

  • 目录中的文件已锁定
  • 您没有对B的写入权限
  • 您没有对的写入权限(可以复制但不能移动)
  • 您有对的写入权限,但不是对其中的每个文件都有写入权限
  • 数据损坏(硬盘损坏)
  • 有人已经移动了那个文件夹
在生产过程中,你可能不会想到更多

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

以下是一篇关于这方面的文章:


这里有一个很棒的教程:

如果文件正在使用中或存在其他错误,则根本无法移动目录,与性能无关;-)。您不是在问如何确定是否可以移动到同一逻辑驱动器上的另一个位置吗?这一点很好。我想这就是我要问的。我将重新措辞。如果文件正在使用中或存在其他错误,则根本无法移动目录,与性能无关;-)。您不是在问如何确定是否可以移动到同一逻辑驱动器上的另一个位置吗?这一点很好。我想这就是我要问的。我要换一种说法。只有保证移动操作是原子的,这才有效。我在API的文档中没有看到任何东西表明,如果无法通过“重命名”移动目录,函数总是会立即抛出。可以,您必须P/Invoke moveFileTransaction(),在Vista及更高版本上可用。但除此之外,不,部分故障是您必须处理的问题。同样的功能也存在于Windows XP中。我只是怀疑没有办法通过编程来利用它。Windows XP在可能的情况下实现按重命名移动,如果失败,则返回到递归移动。我需要自己在XP上也能做到这一点。基本MoveFile()API函数要么成功,要么失败,没有部分失败。我不知道.NET的等价物,但是你可以P/调用它。只有保证移动操作是原子的,这才有效。我在API的文档中没有看到任何东西表明,如果无法通过“重命名”移动目录,函数总是会立即抛出。可以,您必须P/Invoke moveFileTransaction(),在Vista及更高版本上可用。但除此之外,不,部分故障是您必须处理的问题。同样的功能也存在于Windows XP中。我只是怀疑没有办法通过编程来利用它。Windows XP在可能的情况下实现按重命名移动,如果失败,则返回到递归移动。我需要自己在XP上也能做到这一点。基本MoveFile()API函数要么成功,要么失败,没有部分失败。我不知道.NET的等价物,但您可以P/调用它。此外,在罕见的情况下,您可能没有足够的可用空间容纳新的较大的$index缓冲区。在目录或其子目录上打开的活动命令窗口也将强制任何移动或删除操作失败。此外,在罕见的情况下,您可能没有足够的可用空间容纳新的较大的$index缓冲区$index buffer。在目录或其子目录之一上处于活动状态的打开命令窗口也将强制执行任何移动或删除操作