ShIvADeSt

Moderator | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Vitus_Bering Цитата: Получается, что оптимально использовать ShFileOperation. | На самом деле естественно нет, по ряду причин. Допустим есть там один файл, который занят в данный момент каким либо процессом, тогда любая операция шела прервется (потому что так реализзован проводник или это как то обходится?). Для правильного копирования папок и подпапок используется рекурсивная процедура для обхода дерева. Код уже не раз давался, вот еще разок. Цитата: procedure CopyFolder(Source,Destination:string); var FileInfo :TSearchRec; DosCode :integer; begin DosCode := FindFirst(Source+ '\*.*', faAnyFile, FileInfo); try while DosCode = 0 do begin if (FileInfo.Name[1] <> '.') and (FileInfo.Attr <> faVolumeID) then begin if (FileInfo.Attr and faDirectory = faDirectory) then begin MkDir(Destination+'\'+ FileInfo.Name); CopyFolder(Source+'\'+ FileInfo.Name,Destination+'\'+ FileInfo.Name); end else if (FileInfo.Attr and faVolumeID <> faVolumeID) then begin CopyFile(PChar(Source+'\'+FileInfo.Name),PChar(Destination+'\'+FileInfo.Name),false); end; end; DosCode := FindNext(FileInfo); end; finally FindClose(FileInfo); end; // RmDir(FolderDest); end; | далее Цитата: var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char; begin begin AssignFile(FromF, file1); Reset(FromF, 1); | а почему бы не использовать стандартные АПИ функции по работе с файлами? Я так думаю, что быстрее АПИ никто не сможет работать по виндой. Цитата: F1:=OpenFile(FilePath,OfStr,OF_READWRITE); if F1=HFILE_ERROR then begin Status:='Halted. Process is busy.'; Exit; end; SetFilePointer(F1,0,nil,FILE_BEGIN); Res:=ReadFile(F1, A[0], FSize, Bytes,nil) ; WriteFile(F1,Bt,1,Bytes,nil); | проверял, работает быстрее чем стандартный Assign и последующее чтение запись. Так как если посмотреть код то в итоге все равно так идет вызов этих же функций, так проще сразу работать ими.
---------- И создал Бог женщину... Существо получилось злобное, но забавное... |
|