Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
ВнизКак в программе выполнить копирование файла? Найти похожие ветки
← →
MaGG (2002-04-27 12:48) [0]Как в программе выполнить копирование файла?
← →
Johnmen (2002-04-27 13:01) [1]CopyFile
учите матчасть !
← →
MaGG (2002-04-27 13:15) [2]ПОМОГИТЕ! Ну нету у меня книжки,
а в хелпе не нашел.
А еще как удалить файл?
← →
Johnmen (2002-04-27 13:27) [3]DeleteFile
смотри хелп по Win"довым ф-ям....
← →
Vovchik (2002-04-27 13:34) [4]> Johnmen
Я бы Вам самому посоветовал учить матчасть!
Не учите детей неправильным подходам.
> MaGG
Ничего лучше SHFileOperation ещё никто не придумал. Она работает гораздо быстрее, чем CopyFile. См. SDK. Если нет нормального, то в поставке дельфи есть некая старая версия.
← →
MVVD (2002-04-27 13:42) [5]procedure CopyFile(const FileName, DestName: string);
var
CopyBuffer: Pointer; { buffer for copying }
BytesCopied: Longint;
Source, Dest: Integer; { handles }
Len: Integer;
Destination: TFileName; { holder for expanded destination name }
const
ChunkSize: Longint = 8192; { copy in 8K chunks }
begin
Destination := ExpandFileName(DestName); { expand the destination path }
if DMod.HasAttr(Destination, faDirectory) then { if destination is a directory... }
begin
Len := Length(Destination);
if Destination[Len] = "\" then
Destination := Destination + ExtractFileName(FileName) { ...clone file name }
else
Destination := Destination + "\" + ExtractFileName(FileName); { ...clone file name }
end;
GetMem(CopyBuffer, ChunkSize); { allocate the buffer }
try
Source := FileOpen(FileName, fmShareDenyNone); { open source file }
if Source < 0 then raise EFOpenError.CreateFmt(SFOpenError, [FileName]);
try
Dest := FileCreate(Destination); { create output file; overwrite existing }
if Dest < 0 then raise EFCreateError.CreateFmt(SFCreateError, [Destination]);
try
repeat
BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }
if BytesCopied > 0 then { if we read anything... }
FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk }
until BytesCopied < ChunkSize; { until we run out of chunks }
finally
FileClose(Dest); { close the destination file }
end;
finally
FileClose(Source); { close the source file }
end;
finally
FreeMem(CopyBuffer, ChunkSize); { free the buffer }
end;
end;
← →
Johnmen (2002-04-27 13:43) [6]>Vovchik © (27.04.02 13:34)
Пусть дети начинают с малого...
И не надо такого апломба...
← →
MVVD (2002-04-27 13:43) [7]procedure CopyFile(const FileName, DestName: string);
var
CopyBuffer: Pointer; { buffer for copying }
BytesCopied: Longint;
Source, Dest: Integer; { handles }
Len: Integer;
Destination: TFileName; { holder for expanded destination name }
const
ChunkSize: Longint = 8192; { copy in 8K chunks }
begin
Destination := ExpandFileName(DestName); { expand the destination path }
if DMod.HasAttr(Destination, faDirectory) then { if destination is a directory... }
begin
Len := Length(Destination);
if Destination[Len] = "\" then
Destination := Destination + ExtractFileName(FileName) { ...clone file name }
else
Destination := Destination + "\" + ExtractFileName(FileName); { ...clone file name }
end;
GetMem(CopyBuffer, ChunkSize); { allocate the buffer }
try
Source := FileOpen(FileName, fmShareDenyNone); { open source file }
if Source < 0 then raise EFOpenError.CreateFmt(SFOpenError, [FileName]);
try
Dest := FileCreate(Destination); { create output file; overwrite existing }
if Dest < 0 then raise EFCreateError.CreateFmt(SFCreateError, [Destination]);
try
repeat
BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }
if BytesCopied > 0 then { if we read anything... }
FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk }
until BytesCopied < ChunkSize; { until we run out of chunks }
finally
FileClose(Dest); { close the destination file }
end;
finally
FileClose(Source); { close the source file }
end;
finally
FreeMem(CopyBuffer, ChunkSize); { free the buffer }
end;
end;
← →
Vovchik (2002-04-27 13:45) [8]> Johnmen
Зачем придумывать то, что не имеет смысла? Есть нормальная ф-ция, которая быстро копирует и удаляет файлы. Быстрее всё равно не сделаете. Если ради обучения - то пожалуйста! А ф-ция, предложенная MVVD, наверное будет работать, только зачем она нужна?
← →
MVVD (2002-04-27 13:49) [9]stt:= "C:\NameF.pas";
if FileExists(stt) then DeleteFile(PChar(stt));
← →
Johnmen (2002-04-27 13:51) [10]>Vovchik © :
Так я же ничего не придумывал !
И неужели указанные ф-ии абсолютно бессмысленны ?
А разных функций для работы с файлами существет множество,
и какая из них лучше или хуже - еще вопрос...
← →
Shell (2002-04-27 13:56) [11]А если юзер использует альтернативный shell в котором не реализован SHFileOperation?
← →
Vovchik (2002-04-27 14:00) [12]> Johnmen
Нет уж извиняйте, не вопрос. Проделайте простой эксперимент. Скопируйте большое количество файлов сначала при помощи CopyFile, а потом с помощью Експлорера (который использует SHFileOperation). Разницы в 10 раз не гарантирую, но раз в 5 будет точно. В качестве тестового набора файлов подойдёт дистрибутив ХР или 2К. Если копировать один очень большой файл - CopyFile опять же проигрывает, и тоже сильно. Этим объясняется то, что Far копирует намного медленнее, чем Експлорер или WindowsCommander.
По-моему, вопросов быть не может. Проверьте и убедитесь.
А CopyFile остался от 16-битной винды, и его не убрали, видимо, для совместимости со старыми программами.
← →
Johnmen (2002-04-27 14:06) [13]>Vovchik © :
Да я что , спорю что-ли ???????????!!!!!!!!!!!!
Я лишь утверждаю, что ...
>А разных функций для работы с файлами существет множество,
>и какая из них лучше или хуже - еще вопрос...
← →
Vovchik (2002-04-27 14:08) [14]Я так и не понял, в чём вопрос, если одна копирует медленно, а другая быстро...
Кроме того, CopyFile не умеет копировать права.
← →
Shell (2002-04-27 14:11) [15]Вопрос в том, что shell"а у юзера может и не быть
← →
Johnmen (2002-04-27 14:13) [16]"Как в программе выполнить копирование файла? "
CopyFile копирует ? Копирует !
А обсуждение достоинств и недостатков - отдельная тема :)
(я не призываю юзать именно CopyFile)
← →
Johnmen (2002-04-27 14:17) [17]>Shell (27.04.02 14:11) :
Вполне здравое замечание !
И еще - может не быть Win, а быть Linux или Солярка или ... :)
← →
Vovchik (2002-04-27 14:18) [18]> Shell
Как это не быть шела? SHFileOperation сидит в Shell32.dll. А её не может не быть.
Может, вы скажете, что у юзера нет винды?
← →
Shell (2002-04-27 14:24) [19]Для винды, которая безусловно есть на машне юзера может использоваться альтернативный Shell, а родной может быть выдран с корнем
← →
Anatoly Podgoretsky (2002-04-27 14:38) [20]И еще добавить какое количество ошибок совершают при использовании SHFileOperation, а так чего нормальная функции не хуже CopyFile
← →
MaGG (2002-04-27 14:40) [21]Спасибо всем,
Так как првильно пользовать SHFileOperation ?
Из хелпа нихрена непонятно.
Можно примерчик на пальцах?
Что надо подкльчать в Uses?
← →
Johnmen (2002-04-27 14:44) [22]>MaGG : Почитай ветку еще раз и прими верное для тебя решение...
← →
Vovchik (2002-04-27 14:45) [23]А чего там непонятного?
В Uses надо скорее всего ShellApi.
← →
Anatoly Podgoretsky (2002-04-27 14:57) [24]Vovchik © (27.04.02 14:45)
Использование SHFileOperation не совсем тривиально, как кажется на первый взгляд, в хелпе много не понятного для начинающих.
MaGG (27.04.02 14:40)
Смотри еще раз совет от Johnmen © (27.04.02 14:44)
← →
Vovchik (2002-04-27 15:01) [25]Ну вот пристали! Щас раскопаю пример или сам напишу. Кроме того, разобраться надо один раз. А лёгких путей мы не ищем...
← →
Anatoly Podgoretsky (2002-04-27 15:16) [26]Лучше сам напиши, и мы посмотрил как ты знаешь его и MaGG будет польза. Для тех задания в функцию передаем два параметра, откуда и куда типа string (каждый представляет только один файл)
← →
Vovchik (2002-04-27 17:44) [27]>Anatoly Podgoretsky
А кто вы чтобы мне тз давать? Почитайте SDK, там всё написано!
Вот нашёл пример в факах. Не проверял, но выглядит похоже.
uses ShellApi;
procedure TForm1.Button1Click(Sender: TObject);
var
OpStruc: TSHFileOpStruct;
frombuf, tobuf: Array [0..128] of Char;
Begin
FillChar( frombuf, Sizeof(frombuf), 0 );
FillChar( tobuf, Sizeof(tobuf), 0 );
StrPCopy( frombuf, "h:\hook\*.*" );
StrPCopy( tobuf, "d:\temp\brief" );
With OpStruc DO Begin
Wnd:= Handle;
wFunc:= FO_COPY;
pFrom:= @frombuf;
pTo:=@tobuf;
fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
fAnyOperationsAborted:= False;
hNameMappings:= Nil;
lpszProgressTitle:= Nil;
end;
ShFileOperation( OpStruc );
end;
И почему обязательно один файл? Можно сколько угодно. Можно маски давать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.005 c