C# 有没有办法移动一个文件,有能力取消中间的移动?

C# 有没有办法移动一个文件,有能力取消中间的移动?,c#,winapi,C#,Winapi,我正在使用CopyFileEx复制具有该功能的文件。移动文件有类似的方法吗?请记住,并非每个移动都很快–移动到不同的驱动器实际上是一个副本 我现在的解决方案是,如果移动到另一个根目录,则复制并删除原始文件;如果移动到同一个根目录,则只需移动(希望这只是对文件指针的更改) 是否有一个简单的解决方案(如CopyFileEx)?或者可能更合适?我相信可以取消 BOOL WINAPI MoveFileWithProgress( __in LPCTSTR lpExistingFileName

我正在使用
CopyFileEx
复制具有该功能的文件。移动文件有类似的方法吗?请记住,并非每个移动都很快–移动到不同的驱动器实际上是一个副本

我现在的解决方案是,如果移动到另一个根目录,则复制并删除原始文件;如果移动到同一个根目录,则只需移动(希望这只是对文件指针的更改)

是否有一个简单的解决方案(如
CopyFileEx
)?

或者可能更合适?我相信可以取消

BOOL WINAPI MoveFileWithProgress(
  __in      LPCTSTR lpExistingFileName,
  __in_opt  LPCTSTR lpNewFileName,
  __in_opt  LPPROGRESS_ROUTINE lpProgressRoutine,
  __in_opt  LPVOID lpData,
  __in      DWORD dwFlags
);
在卷之间移动文件时,如果lpProgressRoutine由于用户取消操作而返回PROGRESS\u CANCEL,则MoveFileWithProgress将返回零,GetLastError将返回ERROR\u REQUEST\u ABORTED。现有文件保持不变

在卷之间移动文件时,如果lpProgressRoutine由于用户停止操作而返回PROGRESS\u STOP,MoveFileWithProgress将返回零,GetLastError将返回ERROR\u REQUEST\u ABORTED。现有文件保持不变

或者可能更合适?我相信可以取消

BOOL WINAPI MoveFileWithProgress(
  __in      LPCTSTR lpExistingFileName,
  __in_opt  LPCTSTR lpNewFileName,
  __in_opt  LPPROGRESS_ROUTINE lpProgressRoutine,
  __in_opt  LPVOID lpData,
  __in      DWORD dwFlags
);
在卷之间移动文件时,如果lpProgressRoutine由于用户取消操作而返回PROGRESS\u CANCEL,则MoveFileWithProgress将返回零,GetLastError将返回ERROR\u REQUEST\u ABORTED。现有文件保持不变

在卷之间移动文件时,如果lpProgressRoutine由于用户停止操作而返回PROGRESS\u STOP,MoveFileWithProgress将返回零,GetLastError将返回ERROR\u REQUEST\u ABORTED。现有文件保持不变


lpProgressRoutine
使用并返回
progressu CANCEL
lpProgressRoutine
使用并返回
progressu CANCEL

我将使用
SHFileOperation
API,请参见此处获取.NET C包装器:


也请参见此处:

我将使用
SHFileOperation
API,请参见此处以获取.NET C#包装器:


也请参阅此处:

谢谢。它们之间的区别是什么?“…作为事务处理的操作”意味着什么?例如,如果移动是针对整个目录,则它们要么全部成功,要么没有成功。我相信这只适用于本地NTFS移动,而不适用于网络移动。事务处理意味着它是原子的。全部或无。@Cylindric:取决于您的Windows版本。使用7/2K8R2,您可以进行跨系统事务处理。实际上,您可以将SQL事务与本地文件系统和远程文件系统事务链接起来。我只读过这个功能,没有实际使用过。这太疯狂了:)下面有一些聪明的东西。谢谢。它们之间的区别是什么?“…作为事务处理的操作”意味着什么?例如,如果移动是针对整个目录,则它们要么全部成功,要么没有成功。我相信这只适用于本地NTFS移动,而不适用于网络移动。事务处理意味着它是原子的。全部或无。@Cylindric:取决于您的Windows版本。使用7/2K8R2,您可以进行跨系统事务处理。实际上,您可以将SQL事务与本地文件系统和远程文件系统事务链接起来。我只读过关于这个功能的文章,没有实际使用过。这简直是疯了:)下面有一些聪明的东西。