Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.13;
Скачать: CL | DM;

Вниз

Как в программе выполнить копирование файла?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
1-39774
VCL
2002-04-11 15:40
2002.05.13
RichEdit моргает!!


14-39855
XOY
2002-04-02 23:37
2002.05.13
А нафига нужна регистрация?


1-39684
hooky-mars
2002-04-23 22:05
2002.05.13
Путь к файлу


4-39881
Yuri Btr
2002-03-07 10:58
2002.05.13
Messages


1-39778
~DR~
2002-04-28 20:48
2002.05.13
STRINGGRID