Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] нужна помощь с функцией копирования директорий (http://forum.oszone.net/showthread.php?t=210580)

camope3 05-07-2011 23:29 1707866

нужна помощь с функцией копирования директорий
 
Извините за столь банальный вопрос но нужно осуществить копирования каталогов вместе с содержимым средствами 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;

При компиляции выдает ОШИБКУ
Помогите пожалуйста разобраться где "собака зарыта" пересмотрел все не один раз вроде как должно компилироваться.

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

PhilB 05-07-2011 23:45 1707875

Вы ж ее определили с 4мя параметрами
Цитата:

Цитата camope3
Function FullDirectoryCopy(SourceDir,TargetDir: String; StopIfNotAllCopied,
OverWriteFiles: Boolean): Boolean; »

а выываете с 2мя
Цитата:

Цитата camope3
FullDirectoryCopy('c:\1','d:\1') »


camope3 05-07-2011 23:54 1707884

PhilB, Спасибо!!!! Истина была так близко

camope3 06-07-2011 22:21 1708537

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

BlackEric 06-07-2011 22:55 1708556

Можно.
По нормальному - через callback.

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

camope3 11-07-2011 17:14 1711343

Проблему решил, может кому пригодится:
Код:

......
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 1711471

Цитата:

Цитата camope3
Нулевой (Nil) указатель - тот, который имеет значение 0. »

В общем случае не совсем так. Это зависит от архтектуры. Хотя на всех широко используемых действительно 0.
Смысл в том, что nil указатель, который никуда не указывает. Вроде, банально.
Что касается функций winApi, то там очень много специфичных параметров, которые в большинстве случаев не нужны.
Поэтому там так много nil.
Что касается равнозначности конструкций, выделынных полужирным, то это от того, что в winApi очень много типов, которые переопределены друг через друга, и сводятся к нескольким бозовым.

camope3 12-07-2011 22:20 1712120

Спасибо всем кто откликнулся! Окунуться в изучение функций winApi не пришло еще время.


Время: 09:22.

Время: 09:22.
© OSzone.net 2001-