Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Задержка перед копированием файлов


Автор: Nic442 6.5.2006, 18:38
Есть батник который создает два файла. Я их копирую в разные папки, но дело в том, что перед началом копирования файлы иногда ещё не успевают создаться, и в следствии чего не копируются. (я это проверял так: понастовлял сообщений. При быстром закрытии их вылетала ошибка, при медленном всё нормально работало)
 
Код

ShowMessage(Dir+'\'+F_name+'.exe');
CopyFile(PChar(DIR+'\'+F_name+'.exe'),PChar(DIR+'\Compiling\EXE\'+F_name+'.exe'),False);
CopyFile(PChar(DIR+'\'+F_name+'.obj'),PChar(DIR+'\Compiling\OBJ\'+F_name+'.obj'),False);

...
error:= WinExec(PChar('Compiling\EXE\'+F_name+'.exe'), SW_MAXIMIZE);
   if error<=32 then MessageDlg('Произошла ошибка № '+inttostr(error), mtWarning, mbOKCancel, 0);


Как мне определить, что файлы уже созданы и можно приступать к копированию???   

Автор: Yanis 6.5.2006, 18:44
Код

If FileExit(filename) then
  CopyFile(filename, .....
 

Автор: Rouse_ 6.5.2006, 18:52
Yanis, к сожалению если бы изначально все файловые системы были транзакционной модели, то данный код был бы верен. Выход из ситуации: CreateProcess с запуском батника и WaitFor... 

Автор: Демо 6.5.2006, 19:03
В случае, если фалы создаются консольными приложениями есть еще выход:
В конце .bat-файла формировать файл-флажок. А в программе в цикле проверять его наличие. 

Автор: Yanis 6.5.2006, 19:10
Цитата(Rouse_ @  6.5.2006,  18:52 Найти цитируемый пост)
Yanis, к сожалению если бы изначально все файловые системы были транзакционной модели, то данный код был бы верен. Выход из ситуации: CreateProcess с запуском батника и WaitFor...  
 Благодарю за поправку. Я неправильно понял вопрос Nic442'а. 

Автор: Nic442 6.5.2006, 21:02
Демо, Еще весь прикол в том, что после копирования я запускаю скопированный файл средствами делфи, а файл еще не успевает скопироваться и вылетает ошибка.
т.е. до копирования я запускаю батник( сделал там флажок), после копирования я запускаю скопированный файл (но дело еще в том, что он не обезательно будет существовать)

А  можно пример с CreateProcess... smile 
 

Автор: Демо 6.5.2006, 21:07
Nic442, 
Ты бы сказал сначала, как файлы создаются. От этого можно уже отталкиваться.

Добавлено @ 21:09 
Вообще, описал бы весь процесс - что тебе нужно, и какие средства используются на каждом этапе.
А то ничего не понятно - что, зачем, как роисходит... 

Автор: Rouse_ 6.5.2006, 21:26
Цитата(Демо @  6.5.2006,  20:03 Найти цитируемый пост)
В конце .bat-файла формировать файл-флажок

Саня, я бы сказал "ну вы блин даете"... Сам понял что сказал? smile 
(А давайте сделаем подводную лодку, а когда она поплывет - запустим из нее торпеду которая когда доплывет, скажет всему миру что лодка уже плавает).

Цитата(Nic442 @  6.5.2006,  22:02 Найти цитируемый пост)
А  можно пример с CreateProcess...

В местном факе должен быть... 

Автор: Демо 6.5.2006, 21:34
Цитата(Rouse_ @  6.5.2006,  21:26 Найти цитируемый пост)
Саня, я бы сказал "ну вы блин даете"... Сам понял что сказал? 


Ну дык вроде понятно.
Ну если нет, попробую детальнее...

Вот пример .bat-файла с таким условием:

Код

call Prog1.exe
call prog2.exe
@echo end >flag.txt


В первых 2-х строках формирование файлов, в последней - формирование файла-флажка.

ПРограмма, которая ожидает окончания формирования файлов, ожидает, проверяя периодически в цикле появление файла flag.txt. 

Автор: Nic442 7.5.2006, 00:39
Rouse_, 
ВСЕ что я нашел в faq

Код

FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification вместе с WaitForSingleObject 

Автор ответа: Baa 

Взято с Vingrad.ru http://forum.vingrad.ru 


Объясняю подробнее. (Батник работает с компилятором)
Создаю вначале файл с кодом, потом батник. Запускаю батник, он создаёт 3 файла *.exe, *.obj и *.txt(как флаг сгодился и для проги нужен). Первые два файла могут и не создаться, это зависит от кода. Далее я копирую файлы *.obj и *.exe (если есть) в разные папки. И последний шаг - запускаю скопированный экзешник (Тут вторая ошибка. Файлы иногда не успевают скопироваться в другую директорию. Старые с которых копировались файлы удаляются).
Код


CopyFile(PChar(DIR+'\'+F_name+'.exe'),PChar(DIR+'\Compiling\EXE\'+F_name+'.exe'),False);    
CopyFile(PChar(DIR+'\'+F_name+'.obj'),PChar(DIR+'\Compiling\OBJ\'+F_name+'.obj'),False);    
...    
error:= WinExec(PChar('Compiling\EXE\'+F_name+'.exe'), SW_MAXIMIZE);    
   if error<=32 then MessageDlg('Произошла ошибка № '+inttostr(error), mtWarning, mbOKCancel, 0);

 

Автор: evilbllodydemon 7.5.2006, 09:53
решение "в лоб"

Код

while not FileExists('some.txt') do
   Sleep(100);

CopyFile(PChar(DIR+'\'+F_name+'.exe'),PChar(DIR+'\Compiling\EXE\'+F_name+'.exe'),False);     
CopyFile(PChar(DIR+'\'+F_name+'.obj'),PChar(DIR+'\Compiling\OBJ\'+F_name+'.obj'),False);     

error:= WinExec(PChar('Compiling\EXE\'+F_name+'.exe'), SW_MAXIMIZE);     
   if error<=32 then MessageDlg('Произошла ошибка № '+inttostr(error), mtWarning, mbOKCancel, 0);
  

Автор: Демо 7.5.2006, 11:01
С первым ясно. Решение уже было приведено.

Цитата(Nic442 @  7.5.2006,  00:39 Найти цитируемый пост)
Файлы иногда не успевают скопироваться в другую директорию.


А вот это непонятно. 

Автор: Тутанхамец 7.5.2006, 12:01
А ты bat-файл синхронно запускаешь или асинхронно?  

Или это уже не в тему? smile  

Автор: Nic442 7.5.2006, 15:27
по моему разобрался. Глючный батник :-(
Не подскажите, можно ли это сделать без батника. Через ShellExecute ???? (т.к. у пользователя ограниченные права на запуск батников и cmd )

Код

cd D:\Documents and Settings\kuku\Рабочий стол\ПОТОК Программа на Delphi\EXE
path Bo_C\BIN;%path%
set include=Bo_C\INCLUDE
set lib=Bo_C\LIB
set app=Noname_1
if exist %app%.exe del %app%.exe
if exist %app%.obj del %app%.obj
"D:\Documents and Settings\kuku\Рабочий стол\ПОТОК Программа на Delphi\EXE\Bo_C\BIN\bcc.exe" -I%include% -L%lib% %app%.cpp > "D:\Documents and Settings\kuku\Рабочий стол\ПОТОК Программа на Delphi\EXE\Compiling\errout.txt"
 
  

Автор: Dimannn 7.5.2006, 21:44
Nic442, В этом батнике русские буквы. Он работать не будет по определению.
Да, и попробуй заменить корявое
Цитата(evilbllodydemon @  7.5.2006,  09:53 Найти цитируемый пост)
error:= WinExec(PChar('Compiling\EXE\'+F_name+'.exe'), SW_MAXIMIZE);     
   if error<=32 then MessageDlg('Произошла ошибка № '+inttostr(error), mtWarning, mbOKCancel, 0);
 на 
Код

If WinExec(PChar('Compiling\EXE\'+F_name+'.exe'), SW_MAXIMIZE) <= 32 then RaiseLastWin32Error;

Это выдаст полное описание ошибки 

Автор: Nic442 7.5.2006, 23:30
Батник работает...
(Dir='D:\Documents and Settings\kuku\Рабочий стол\ПОТОК Программа на Delphi\EXE')

я использую перед запуском батника CharToOem(PChar(Dir),PChar(Dir)); И все работает. Правдо промучался как негр на планктации, чтобы найти ошибку...
Код

....
  CharToOem(PChar(Dir),PChar(Dir));
  Writeln(BAT, 'cd '+Dir);
  Writeln(BAT,'path Bo_C\BIN;%path%');
  Writeln(BAT,'set include=Bo_C\INCLUDE');
  Writeln(BAT,'set lib=Bo_C\LIB');
  F_name:= ExtractFileName(F_pute);
  rasshir:=ExtractFileExt(F_pute);
  Delete(F_name, Length(F_name)-Length(rasshir)+1, Length(rasshir));
  Writeln(BAT,'set app='+F_name);
  Writeln(BAT,'if exist %app%.exe del %app%.exe');
  Writeln(BAT,'if exist %app%.obj del %app%.obj');
  Writeln(BAT,'"'+Dir+'\Bo_C\BIN\bcc.exe" -I%include% -L%lib% %app%.cpp > "'+Dir+'\Compiling\errout.txt"');
  OemToChar(PChar(Dir),PChar(Dir));
...
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)