有没有一种方法可以移动文件并能够在中间取消移动?

Posted

技术标签:

【中文标题】有没有一种方法可以移动文件并能够在中间取消移动?【英文标题】:Is there a way to move a file with the ability to cancel the move in the middle? 【发布时间】:2020-10-15 16:17:25 【问题描述】:

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

如果移动到不同的根目录,我现在的解决方案是复制并删除原始文件,如果是,则简单地移动(并希望它实际上只是指向文件的指针的更改)到同一个根目录。

是否有直接的解决方案(如CopyFileEx)?

【问题讨论】:

【参考方案1】:

MoveFileTransacted 或 MoveFileWithProgress 可能更合适?我相信可以取消。

BOOL WINAPI MoveFileWithProgress(
  __in      LPCTSTR lpExistingFileName,
  __in_opt  LPCTSTR lpNewFileName,
  __in_opt  LPPROGRESS_ROUTINE lpProgressRoutine,
  __in_opt  LPVOID lpData,
  __in      DWORD dwFlags
);

跨卷移动文件时,如果 lpProgressRoutine 由于用户取消操作而返回 PROGRESS_CANCEL,则 MoveFileWithProgress 将返回零,GetLastError 将返回 ERROR_REQUEST_ABORTED。现有文件保持不变。

跨卷移动文件时,如果 lpProgressRoutine 由于用户停止操作而返回 PROGRESS_STOP,则 MoveFileWithProgress 将返回零,GetLastError 将返回 ERROR_REQUEST_ABORTED。现有文件保持不变。

【讨论】:

谢谢。它们之间有什么区别 = “...作为交易操作”是什么意思? 如果移动是针对整个目录,例如,它们要么全部成功,要么都不成功。我相信这仅适用于本地 NTFS 移动,而不适用于网络移动。 Transacted 意味着它是原子的。全部或没有。 @Cylindric:取决于您的 Windows 版本。使用 7/2K8R2,您可以进行跨系统事务。您实际上可以将 SQL 事务与本地文件系统和远程文件系统事务链接起来。我只是阅读了有关该功能的信息,并没有实际使用它。 太疯狂了 :) 有一些聪明的东西即将推出。【参考方案2】:

使用MoveFileWithProgress 并从lpProgressRoutine 返回PROGRESS_CANCEL

【讨论】:

【参考方案3】:

我会使用 SHFileOperation API,请参阅此处了解 .NET C# 包装器:

https://***.com/a/3282481/559144

也可以参考这里:http://pinvoke.net/default.aspx/shell32.SHFileOperation

【讨论】:

以上是关于有没有一种方法可以移动文件并能够在中间取消移动?的主要内容,如果未能解决你的问题,请参考以下文章

linux中的vim 编辑一行内容,如何使光标快速移动到行首和行尾以及行中间某处啊

c# 移动单个文件到文件夹中

Vim Reference

在Excel中的一个单元格里光标怎么上下移动

有没有一种好方法可以将文件中具有特定字符(不是文件名)的 .txt 文件移动到另一个目录?

重叠 UIView 动画取消第一个完成块