有几种复制文件的方法: using TFileStream
, using TShFileOpStruct
,Windows.CopyFile
(至少这是我发现的)。
当我使用我提到的其中一种方式开始文件复制时,我的应用程序冻结(只有文件复制窗口处于活动状态)并且当我关闭我的应用程序时,文件复制也被取消。
是否可以复制/移动文件以使该过程不依赖于我的应用程序?
我的意思是,我怎样才能开始复制/移动操作然后关闭我的应用程序并且复制/移动将保留?
有几种复制文件的方法: using TFileStream
, using TShFileOpStruct
,Windows.CopyFile
(至少这是我发现的)。
当我使用我提到的其中一种方式开始文件复制时,我的应用程序冻结(只有文件复制窗口处于活动状态)并且当我关闭我的应用程序时,文件复制也被取消。
是否可以复制/移动文件以使该过程不依赖于我的应用程序?
我的意思是,我怎样才能开始复制/移动操作然后关闭我的应用程序并且复制/移动将保留?
请参阅@David 的帖子,另外。有一次我记得我在哪里有类似的要求,我不得不在应用程序关闭时在网络驱动器上制作一些数据的备份副本。我只是在 OnClose 处理程序中将 CloseAction 设置为 caHide,因此一直加载应用程序,直到运行副本的线程完成,然后它调用 ExitProcess() 最终死掉。
这种简单方法的问题在于,用户可能会尝试在旧的应用程序仍在进行备份时启动应用程序的另一个副本——这会导致很大的问题。我们只是在用户手册中添加了一段来涵盖这一点,但有一些更好的解决方案,例如。强制新实例等待启动,直到任何旧实例完成,会更好。大卫运行单独进程的解决方案在这方面似乎更胜一筹,mod。任何新应用实例的复制和启动之间的任何“干扰”。
即使在您关闭应用程序后也要复制到另一个位置,您可以尝试使用batch
文件...
xcopy d:\from_folder\*.* d:\Tofolder\.
这您可以在批处理文件中执行并让您关闭应用程序,批处理文件将继续将文件复制到目标..
你可以使用 shellexecute
procedure MycopyAndCloseapplication;
begin
ShellExecute(handle,'open',pchar('d:\mycopyingBatch.bat'),nil,nil, SW_SHOWNORMAL) ;
//here than you close your application..
end;
复制包含更多文件夹的文件夹试试这个
xcopy d:\sourceFolder d:\destinationFolder /E /Y
还要检查这些链接
我知道的所有文件复制 API 都在调用过程中执行。这意味着当您终止进程时,文件复制也将终止。
因此,为了确保应用程序关闭后文件复制继续进行,您需要从不同的进程运行文件复制。您可以创建一个简单的进程来完成这项工作并将命令行参数传递给它以指定要复制的文件。
如果您只想在复制过程中解冻主应用程序,那么您可以创建一个单独的线程来执行文件复制。