Войти

Показать полную графическую версию : [решено] нужна помощь с функцией копирования директорий


camope3
05-07-2011, 23:29
Извините за столь банальный вопрос но нужно осуществить копирования каталогов вместе с содержимым средствами delphi.
Нашел Вот такую функцию:
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.Button1Click(Sender: TObject);
begin
//Копируем все файлы из директории с:\1 в директорию d:\1
if FullDirectoryCopy('c:\1','d:\1') then
ShowMessage ('Удачно скопировано') else
ShowMessage ('Не удалось скопировать'+IntToStr(GetLastError));

end;

При компиляции выдает ОШИБКУ (http://i030.radikal.ru/1107/73/da0baae539ac.jpg)
Помогите пожалуйста разобраться где "собака зарыта" пересмотрел все не один раз вроде как должно компилироваться.

Заранее благодарен

PhilB
05-07-2011, 23:45
Вы ж ее определили с 4мя параметрами
Function FullDirectoryCopy(SourceDir,TargetDir: String; StopIfNotAllCopied,
OverWriteFiles: Boolean): Boolean; »
а выываете с 2мя
FullDirectoryCopy('c:\1','d:\1') »

camope3
05-07-2011, 23:54
PhilB, Спасибо!!!! Истина была так близко

camope3
06-07-2011, 22:21
Еще вопрос по этой же функции. К ней можно как то приклеить индикатор выполнения процесса? (ProgressBar) Если можно и не трудно объяснить то как? Или хотя бы "да" или "нет".

BlackEric
06-07-2011, 22:55
Можно.
По нормальному - через callback.

Ну или в цикле считать проценты и напрямую дергать ProgressBar, но это некрасиво.

camope3
11-07-2011, 17:14
Проблему решил, может кому пригодится:
......
function CopyCallBack(TotalFileSize,
TotalBytesTransferred,
StreamSize,
StreamBytesTransferred:LARGE_INTEGER;
dwStreamNumber,
dwCallbackReason:DWORD;
hSourceFile,
hDestinationFile:THandle;
lpData:pointer):DWORD; stdcall;
begin
Form1.ProgressBar1.Position:=
Round((TotalBytesTransferred.QuadPart/TotalFileSize.QuadPart)*100);
result:=PROGRESS_CONTINUE;
end;

Function FullDirectoryCopy(SourceDir,TargetDir: String; StopIfNotAllCopied,
OverWriteFiles: Boolean): Boolean;
{StopIfNotAllCopied: если значение этого аргумента = True, то при
первой же ошибке копирования файла или папки, работы функции прекратится
а функуция вернёт False. В случае если этот аргумент = False,
то ошибки копирования учитываться не будут.
OverWriteFiles: если True, то существующие файлы будут переписаны.}
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:= CopyFileEx(Pchar(SourceDir + SR.Name), Pchar(TargetDir + SR.Name), @CopyCallBack,nil,nil,0)
Else
Result:=True;
If Not Result And StopIfNotAllCopied Then
Exit;
End;
I:=FindNext(SR);
End;
Finally
SysUtils.FindClose(SR);
End;
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
//Копируем все файлы из директории Memo1.Text в директорию Memo2.Text
if FullDirectoryCopy
(PChar(Memo1.Text),PChar(Memo2.Text),false,true) then
ShowMessage ('Копирование завершено!') else
ShowMessage ('Не удалось скопировать! Код ошибки:'+IntToStr(GetLastError));
.......


Что бы внести остаточную ясность в мой разум хотелось бы узнать что значит nil,nil,0 ?
встречал еще такие варианты nil,PBOOL(False),0 . В справочной литературе нашел такое:
Константа Nil - значение не присвоенного указателя.

Использование нулевого (Nil) указателя приводит к исключению.

Nil используется главным образом как замена параметра Указателя - это говорит программе, что параметру присвоено значение не указателя.

Указательные переменные не установлены на Nil, кроме как в специальных обстоятельствах, типа при создании нового объекта, который содержит указатели. Это потому, что Delphi инициализирует память, взятую для нового объекта с 0-ми. Нулевой (Nil) указатель - тот, который имеет значение 0.
Можно как то обяснить более понятливей :) ?

PhilB
11-07-2011, 21:25
Нулевой (Nil) указатель - тот, который имеет значение 0. »
В общем случае не совсем так. Это зависит от архтектуры. Хотя на всех широко используемых действительно 0.
Смысл в том, что nil указатель, который никуда не указывает. Вроде, банально.
Что касается функций winApi, то там очень много специфичных параметров, которые в большинстве случаев не нужны.
Поэтому там так много nil.
Что касается равнозначности конструкций, выделынных полужирным, то это от того, что в winApi очень много типов, которые переопределены друг через друга, и сводятся к нескольким бозовым.

camope3
12-07-2011, 22:20
Спасибо всем кто откликнулся! Окунуться в изучение функций winApi не пришло еще время.




© OSzone.net 2001-2012