Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2011, 09:20   #1
Never74
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 20
Вопрос Зависание приложения после копирования каталогов

Здравствуйте!

Столкнулся с проблемой копирования каталогов.

Использую готовую функцию:
Цитата:
function FullDirectoryCopy(SourceDir, TargetDir: string; StopIfNotAllCopied,OverWriteFiles: Boolean): Boolean;
var
SR: TSearchRec;
I: Integer;
begin
Result := False;
SourceDir := IncludeTrailingBackslash(SourceDir) ;
TargetDir := IncludeTrailingBackslash(TargetDir) ;
if not DirectoryExists(SourceDir) then
Exit;
if not ForceDirectories(TargetDir) then
Exit;
I := FindFirst(SourceDir + '*', faAnyFile, SR);
try
while I = 0 do
begin
if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
begin
if SR.Attr = faDirectory then
Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME,StopIfNotAllCopied, OverWriteFiles)
else if not (not OverWriteFiles and FileExists(TargetDir + SR.Name))
then
Result := CopyFile(Pchar(SourceDir + SR.Name), Pchar(TargetDir + SR.Name), False)
else
Result := True;
if not Result and StopIfNotAllCopied then
exit;
end;
I := FindNext(SR);
end;
finally
SysUtils.FindClose(SR);
end;
end;
Выводом является:
Цитата:
procedure TForm1.But_Copy_DirClick(Sender: TObject);
var path,paths:string;
begin
path:=(PChar(ExtractFilePath(ParamS tr(0))+'От куда копировать'));
paths:=(PChar(ExtractFilePath(Param Str(0))+'Куда копировать'));
FullDirectoryCopy(path,paths,True,F alse);
end;
Пробовал с указанием меток дисков, тоже не помогло, зависает.

Итог: Приложение копирует, но не всё, т.к. зависает. И что самое интересное. Если приложение весит, а я удаляю эти скопированные каталоги, она их по новой начинает копировать, но только уже часть.

Опыт: Раньше она работала нормально, пока не поставил другую версию delphi 7 и функцию удаления.

Функция удаления каталогов с файлами:
Цитата:
function DelDir(dir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
pFrom := PChar(dir + #0);
end;
Result := (0 = ShFileOperation(fos));
end;
Я думал у меня комп уже погнал, перезагрузил, но толку 0.
Убирал функцию удаления, тоже толку 0.
Я в тупике и не знаю уже, что делать.

Поделитесь пожалуйста опытом, советом полезным или подскажите как правильно сделать.
И заранее прошу без критики, т.к. критика не поможет решить данную проблему.
Never74 вне форума Ответить с цитированием
Старый 21.09.2011, 09:45   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Работа алгоритма не завсит от того, в какой IDE delphi он был обработан.

Вы забыли в долгом цикле(while) поставить промежуточную обработку сообщений Application.ProcessMessages по этому ваше приложение не отвечает системе когда работает алгоритм.

По поводу удаления.. как вариант использовать TSearchRec и рекурсию, и просто удалять все файлы из самой глубокой папки а затем папку, и так вверх по спискую.
Человек_Борща вне форума Ответить с цитированием
Старый 21.09.2011, 12:34   #3
Never74
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 20
По умолчанию

Человек_Борща, покажи пожалуйста, как правильно нужно вставить Application.ProcessMessages, а то у меня ни чего не выходит.
Never74 вне форума Ответить с цитированием
Старый 21.09.2011, 13:12   #4
Dreanks
Пользователь
 
Регистрация: 10.01.2010
Сообщений: 28
По умолчанию

если не ошибаюсь в начале работы цикла
Dreanks вне форума Ответить с цитированием
Старый 23.09.2011, 14:25   #5
Never74
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 20
По умолчанию

Человек_Борща,Dreanks, спасибо
Never74 вне форума Ответить с цитированием
Старый 23.09.2011, 14:32   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.delphikingdom.ru/asp/view...catalogid=1355
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.09.2011, 14:34   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Код:
pFrom := PChar(dir + #0);
F1:
Цитата:
The last file name is terminated with a double NULL character ("\0\0") to indicate the end of the buffer.
Я бы сделал #0#0 явно. Указанный код крайне не надёжен, т.к. зависит от недокументированных особенностей реализации компилятора.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
После запуска приложения из службы созданной на C# не отображается иконка приложения dmail1976 Общие вопросы .NET 1 22.09.2011 13:38
Зависание приложения при запуске Lazio Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 16.05.2011 16:58
Зависание приложения и скорость закачки russian-stalker Общие вопросы Delphi 4 09.09.2008 20:18