Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задержка перед копированием файлов 
:(
    Опции темы
Nic442
Дата 6.5.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



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

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);


Как мне определить, что файлы уже созданы и можно приступать к копированию???   
PM MAIL   Вверх
Yanis
Дата 6.5.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Код

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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 6.5.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



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


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Демо
Дата 6.5.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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


--------------------
    
PM MAIL ICQ Skype   Вверх
Yanis
Дата 6.5.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Nic442
Дата 6.5.2006, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



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

А  можно пример с CreateProcess... smile 
 
PM MAIL   Вверх
Демо
Дата 6.5.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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

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


--------------------
    
PM MAIL ICQ Skype   Вверх
Rouse_
Дата 6.5.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



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

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

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

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


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Демо
Дата 6.5.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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


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

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

Код

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


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

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


--------------------
    
PM MAIL ICQ Skype   Вверх
Nic442
Дата 7.5.2006, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



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);

 
PM MAIL   Вверх
evilbllodydemon
Дата 7.5.2006, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 28.4.2006
Где: Кисловодск

Репутация: 4
Всего: 4



решение "в лоб"

Код

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);
  

Это сообщение отредактировал(а) evilbllodydemon - 7.5.2006, 10:35
PM MAIL WWW ICQ   Вверх
Демо
Дата 7.5.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



С первым ясно. Решение уже было приведено.

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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
Тутанхамец
Дата 7.5.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 1
Всего: 6



А ты bat-файл синхронно запускаешь или асинхронно?  

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

Это сообщение отредактировал(а) Тутанхамец - 7.5.2006, 12:02
PM MAIL   Вверх
Nic442
Дата 7.5.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



по моему разобрался. Глючный батник :-(
Не подскажите, можно ли это сделать без батника. Через 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"
 
  

Это сообщение отредактировал(а) Nic442 - 7.5.2006, 16:03
PM MAIL   Вверх
Dimannn
Дата 7.5.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



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;

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


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0952 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.