有没有一种方法可以移动文件并能够在中间取消移动?
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 编辑一行内容,如何使光标快速移动到行首和行尾以及行中间某处啊