gpt4 book ai didi

winapi - 阻止 CopyFileEx 的回调是否安全?

转载 作者:行者123 更新时间:2023-12-04 13:00:03 25 4
gpt4 key购买 nike

Windows API 函数 CopyFileEx 允许指定一个回调函数,当文件的一部分被复制到例如向用户提供有关进度的反馈。

这在我的程序中运行良好,但我现在有一个额外的要求:我需要暂时暂停复制过程,以将系统负载保持在低水平一段时间(可能长达几个小时),然后再恢复它。这可能随时发生,通常有一个大文件(几个 100 GB)只被部分复制,所以中止进程并重新启动它不是一个好的选择,因为这意味着可能 99% 的文件已经被复制了,需要再次复制。

一种选择是在调用回调时让执行复制的线程休眠,例如

function ProgressCallback(
_TotalFileSize, _TotalBytesTransferred, _StreamSize,
_StreamBytesTransferred: LARGE_INTEGER;
_StreamNumber, _CallbackReason: LongWord;
_SourceFile, _DestinationFile: THandle; _Data: Pointer): LongWord;
far; stdcall;
begin
// [...]
while gblPauseFlag do
sleep(100);
end;

(这当然是简化的代码。原始代码太复杂了,无法在此处发布。) gblPauseFlag 将由应用程序中检查暂停条件的不同线程设置和重置。

我知道有更好的方法来暂停线程(事件、临界区或其他),但这里的问题只是:在回调函数中暂停复制线程是否安全?或者它会阻止某些 Windows 功能或资源?

从示例代码中可以看出,这是一个Delphi程序,但我认为这并不重要,所以我没有将问题标记为[delphi]。

编辑:我可以通过标志 COPY_FILE_RESTARTABLE,但是:

Progress of the copy is tracked in the target file in case the copy fails. The failed copy can be restarted at a later time by specifying the same values for lpExistingFileName and lpNewFileName as those used in the call that failed. This can significantly slow down the copy operation as the new file may be flushed multiple times during the copy operation.



来源: CopyFileEx documentation

所以我宁愿尽量避免这种情况。

最佳答案

理想情况下,当您要复制如此大的文件时,您应该使用像 robocopy 这样的实用程序。对于大文件。如果您仍然更喜欢编写自己的实用程序,请使其可以重新启动中止的副本。您可以使用文件流将有关副本进度的元数据存储在目标文件中。

关于winapi - 阻止 CopyFileEx 的回调是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49296670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com