如何安全地杀死 robocopy 进程

Posted

技术标签:

【中文标题】如何安全地杀死 robocopy 进程【英文标题】:How to safely kill robocopy process 【发布时间】:2021-03-25 15:23:57 【问题描述】:

我有一个 win32 应用程序,我正在为一些文件传输启动一个 robocopy 子进程。如果我使用 TerminateProcess 终止进程,是否有可能以损坏的文件结束?如果可以,如何避免?

【问题讨论】:

你试过了吗?您可以设置一个复制非常大的文件的测试,然后练习几次杀死 robocopy,看看结果如何。这可能不能证明它是安全的,但它可以很容易地证明它是否不安全。 有几种方法可以结束进程,TerminateProcess 应该是最后的努力。 一旦您将文件复制到外部进程,就没有安全的方法来终止该进程。您是否因文件系统损坏而告终,很大程度上取决于所涉及的文件系统。如果您想安全地取消复制,请实施复制并使其可取消。 【参考方案1】:

来自TerminateProcess函数,

TerminateProcess 函数用于无条件地导致 退出的过程。动态链接维护的全局数据状态 如果使用 TerminateProcess 而不是库 (DLL) 可能会受到损害 而不是 ExitProcess。

请记住,TerminateProcess 不允许其目标清理并以有效状态退出。

尝试干净地关闭进程,参考下面的链接,

How To Terminate an Application "Cleanly" in Win32

如果 robocopy 进程终止,被复制的文件将具有 (a) 1980-01-01 (b) 与原始文件大小相同的时间戳

然后在命令行中再次使用robocopy复制带有TimeStamp的文件。

参考:How to use Robocopy to copy files with TimeStamp in command line

【讨论】:

以上是关于如何安全地杀死 robocopy 进程的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中,如何可靠地杀死进程树 [重复]

如何有效地杀死C ++(Win32)中的进程?

线程杀死其父进程是不是安全?

如何使用给定的部分名称杀死所有进程?

杀死任一线程并退出进程

在 USR1 信号后可靠地杀死睡眠进程