Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] нужна помощь с функцией копирования директорий

Ответить
Настройки темы
Delphi - [решено] нужна помощь с функцией копирования директорий

Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Извините за столь банальный вопрос но нужно осуществить копирования каталогов вместе с содержимым средствами 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;
При компиляции выдает ОШИБКУ
Помогите пожалуйста разобраться где "собака зарыта" пересмотрел все не один раз вроде как должно компилироваться.

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

Отправлено: 23:29, 05-07-2011

 

Старожил


Сообщения: 198
Благодарности: 51

Профиль | Отправить PM | Цитировать


Вы ж ее определили с 4мя параметрами
Цитата camope3:
Function FullDirectoryCopy(SourceDir,TargetDir: String; StopIfNotAllCopied,
OverWriteFiles: Boolean): Boolean; »
а выываете с 2мя
Цитата camope3:
FullDirectoryCopy('c:\1','d:\1') »
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:45, 05-07-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:54, 05-07-2011 | #3


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:21, 06-07-2011 | #4


Старожил


Сообщения: 435
Благодарности: 63

Профиль | Отправить PM | Цитировать


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

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

-------
black-eric.livejournal.com


Отправлено: 22:55, 06-07-2011 | #5


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Проблему решил, может кому пригодится:
Код: Выделить весь код
......
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.
Можно как то обяснить более понятливей ?
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:14, 11-07-2011 | #6


Старожил


Сообщения: 198
Благодарности: 51

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:25, 11-07-2011 | #7


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:20, 12-07-2011 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] нужна помощь с функцией копирования директорий

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Нужна помощь!!! Paruir Тест-форум 0 09-02-2011 16:35
Нужна помощь Olegtrl Хочу все знать 1 04-04-2010 15:45
Нужна помощь capt 1 Общий по Linux 27 28-09-2004 14:03
нужна помощь NiceSindy Хочу все знать 11 01-05-2004 10:16
нужна помощь Garry73 Хочу все знать 1 27-03-2004 16:04




 
Переход