Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-39689
tsarevep
2002-04-29 12:02
2002.05.13
RichText и ListBox


14-39831
VID
2002-04-03 12:37
2002.05.13
ЖК Монитор - 2


1-39699
ymin
2002-04-29 15:16
2002.05.13
Combobox


14-39848
Slava
2002-04-03 10:40
2002.05.13
http://www.delphiplus.org


1-39722
SB.John
2002-04-27 11:04
2002.05.13
Как присвоить событию свою процедуру





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский