Копирование файла после закрытия приложения

Есть несколько способов скопировать файлы: с помощью TFileStream, с помощью TShFileOpStruct, Windows.CopyFile (по крайней мере, это то, что я нашел).
Когда я начинаю копирование файлов одним из упомянутых мной способов, мое приложение зависает (только копирование файлов окно активно), и когда я закрываю свое приложение, копирование файлов также отменяется.

Можно ли копировать / перемещать файлы, чтобы процесс не зависел от моего приложения?
Я имею в виду, как я могу начать операцию копирования / перемещения, а затем закрыть мое приложение, и копирование / перемещение останется?


person serhiyiv    schedule 22.02.2012    source источник
comment
посмотрите, поможет ли вам этот вопрос www.stackoverflow.com/questions/2205746/writing-a-batch-file-for-date-based-file-copying   -  person PresleyDias    schedule 22.02.2012


Ответы (3)


См. Сообщение @David, плюс .. Один раз я вспомнил, где у меня было подобное требование, мне пришлось сделать резервную копию некоторых данных на сетевом диске при закрытии приложения. Я просто установил CloseAction на caHide в обработчике OnClose и, таким образом, оставил приложение загруженным до тех пор, пока поток, запускающий копию, не был завершен, после чего он вызвал ExitProcess (), чтобы окончательно умереть.

Проблема с этим простым подходом заключается в том, что пользователь мог попытаться запустить другую копию приложения, в то время как старая все еще выполняла резервное копирование - это вызвало большие проблемы. Мы просто добавили параграф в руководство пользователя, чтобы охватить это, но какое-то лучшее решение, например. было бы лучше заставить новые экземпляры ждать при запуске, пока не закончат работу все старые. Решение Дэвида о запуске отдельного процесса могло бы показаться лучше в этом отношении, mod. любое «вмешательство» между копией и запуском любого нового экземпляра приложения.

person Martin James    schedule 22.02.2012
comment
Можно остановить другой экземпляр приложения с помощью mutex или file mapping. Подробнее см. Здесь: Управление количеством экземпляров приложения. - person LU RD; 22.02.2012
comment
@LURD да - я знал, как это сделать, но я был по уши в других критических ошибках, и у меня не было времени реализовать / протестировать его. Мы были вынуждены задокументировать эту «особенность» вместо того, чтобы исправлять ее ... - person Martin James; 22.02.2012

для копирования в другое место даже после того, как вы закрыли приложение, вы можете попробовать это, используя 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

также проверьте эти ссылки

написание пакетного файла для копирования файлов на основе даты

команда прямого копирования пакетного файла

пакетный файл для копирования файлов в другое место

person PresleyDias    schedule 22.02.2012

Все известные мне API копирования файлов выполняются в вызывающем процессе. Это означает, что при завершении процесса копирование файла также будет прекращено.

Итак, чтобы гарантировать, что копирование файла продолжится после закрытия вашего приложения, вам нужно будет запустить копию файла из другого процесса. Вы можете создать простой процесс, который выполняет свою работу, и передать ему аргументы командной строки, чтобы указать, какие файлы копировать.

Если вы просто хотите разморозить основное приложение во время копирования, вы можете создать отдельный поток для выполнения копирования файла.

person David Heffernan    schedule 22.02.2012
comment
›Вы можете создать простой процесс, который выполняет свою работу, и передать ему аргументы командной строки, чтобы указать, какие файлы копировать. Не могли бы вы привести пример, как это сделать ?! Кроме того, при копировании / вставке файлов в проводнике Windows я могу закрыть окно проводника, и копирование файлов продолжится. Как это работает? - person serhiyiv; 23.02.2012
comment
С какой частью у вас проблемы? Создаете программу? Разбор аргументов командной строки? Используете CreateProcess или ShellExecute для запуска другого процесса? - person David Heffernan; 23.02.2012
comment
Анализируйте аргументы командной строки, используя ParamStr. ShellExecute, вероятно, проще, чем CreateProcess, но в любом случае это довольно просто. - person David Heffernan; 23.02.2012
comment
Насколько я понимаю, мне нужно создать другое приложение, которое будет запускать копирование файлов, и я должен запустить это (второе) приложение из моего первого приложения, анализирующего аргументы командной строки. Я прав? - person serhiyiv; 23.02.2012
comment
Да, это сработает. В качестве альтернативы вы можете изменить назначение существующего приложения и просто заставить его переключать поведение при запуске с определенными аргументами. - person David Heffernan; 23.02.2012