|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] нужна помощь с функцией копирования директорий |
|
Delphi - [решено] нужна помощь с функцией копирования директорий
|
Новый участник Сообщения: 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; Помогите пожалуйста разобраться где "собака зарыта" пересмотрел все не один раз вроде как должно компилироваться. Заранее благодарен |
|
Отправлено: 23:29, 05-07-2011 |
Старожил Сообщения: 198
|
Профиль | Отправить PM | Цитировать |
Отправлено: 23:45, 05-07-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать PhilB, Спасибо!!!! Истина была так близко
|
Отправлено: 23:54, 05-07-2011 | #3 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Еще вопрос по этой же функции. К ней можно как то приклеить индикатор выполнения процесса? (ProgressBar) Если можно и не трудно объяснить то как? Или хотя бы "да" или "нет".
|
Отправлено: 22:21, 06-07-2011 | #4 |
Старожил Сообщения: 435
|
Профиль | Отправить PM | Цитировать Можно.
По нормальному - через callback. Ну или в цикле считать проценты и напрямую дергать ProgressBar, но это некрасиво. |
|
------- Отправлено: 22:55, 06-07-2011 | #5 |
Новый участник Сообщения: 29
|
Профиль | Отправить 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,PBOOL(False),0 . В справочной литературе нашел такое: Константа Nil - значение не присвоенного указателя. Использование нулевого (Nil) указателя приводит к исключению. Nil используется главным образом как замена параметра Указателя - это говорит программе, что параметру присвоено значение не указателя. Указательные переменные не установлены на Nil, кроме как в специальных обстоятельствах, типа при создании нового объекта, который содержит указатели. Это потому, что Delphi инициализирует память, взятую для нового объекта с 0-ми. Нулевой (Nil) указатель - тот, который имеет значение 0. Можно как то обяснить более понятливей ![]() |
Отправлено: 17:14, 11-07-2011 | #6 |
Старожил Сообщения: 198
|
Профиль | Отправить PM | Цитировать Цитата camope3:
Смысл в том, что nil указатель, который никуда не указывает. Вроде, банально. Что касается функций winApi, то там очень много специфичных параметров, которые в большинстве случаев не нужны. Поэтому там так много nil. Что касается равнозначности конструкций, выделынных полужирным, то это от того, что в winApi очень много типов, которые переопределены друг через друга, и сводятся к нескольким бозовым. |
|
Отправлено: 21:25, 11-07-2011 | #7 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Спасибо всем кто откликнулся! Окунуться в изучение функций winApi не пришло еще время.
|
Отправлено: 22:20, 12-07-2011 | #8 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Нужна помощь!!! | 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 |
|