Текущий архив: 2004.01.16;
Скачать: CL | DM;
Вниз
В паскале нет функции копирования файлов? Найти похожие ветки
← →
Goblin (2003-12-26 12:15) [0]Ведь использование вызовов WinApi противоречит концепции мультиплатформенности языка.
← →
PVOzerski © (2003-12-26 12:25) [1]Дык ведь такую функцию написать - минута работы.
← →
Goblin (2003-12-26 12:33) [2]мне кажется разработчикам компилятора можно было бы ее ввести, как "ссылку" на вызов винапи, чтобы при переходе на другую платформу ее поменяли на соответствующий вызов апи той платформы. В результате текст проги не как и положено комптлируемым языкам не прийдется править.
Написать то можно, но скорость IMHO пострадает, т.к. буфер твоей проги и буфер ядра OS работают явно не одинаково :-(.
← →
Иван Шихалев © (2003-12-26 12:37) [3]При чем тут компилятор? Это RTL. Компилятор вообще не обязан иметь функций работы с файлами.
← →
PVOzerski © (2003-12-26 12:45) [4]>Написать то можно, но скорость IMHO пострадает, т.к. буфер твоей
>проги и буфер ядра OS работают явно не одинаково :-(.
Так ведь RTL - и так надстройка над API. Пишешь GetMem, подразумеваешь VirtualAlloc(в Delphi) или HeapAlloc (в FPC/Win32). А если (что на самом деле) ситуация сложнее и все-таки работает свой менеджер кучи, так это ради того, чтобы сделать работу с памятью более эффективной по сравнению с работой на API. Я когда-то сравнивал время работы программ, в цикле делавших либо GlobalAlloc, GlobalLock, GlobalUnlock, GlobalFree, либо GetMem, FreeMem - так выигрыш был отнюдь не у WinAPI. То же, IMHO, - и с файловыми операциями.
← →
Goblin (2003-12-26 12:52) [5]Ошибочка, читать как:
В результате текст проги как и положено компилируемым языкам не прийдется править.
>Иван Шихалев © (26.12.03 12:37) [3]
Я и не говорю про компилятор, я говорю про базовый набор ф-ций языка Pascal. Поиск, открытие, закрытие, запись, чтение, удаление, создание, переименование есть, а копирования нет.
← →
Goblin (2003-12-26 12:57) [6]>PVOzerski © (26.12.03 12:45) [4]
Т.е., условно говоря, операция копирования сделанная по схеме:
открываем - читаем в буфер - создаем новый файл - записываем содержимое буфера
не будет уступать в скорости одному вызову винапи CopyFile( ); ?
← →
PVOzerski © (2003-12-26 12:58) [7]2Goblin (26.12.03 12:57) [6]:
Предлагаю проверить.
← →
Kerk © (2003-12-26 12:58) [8]
> Goblin (26.12.03 12:57) [6]
А CopyFile по твоему работает иначе?
← →
Anatoly Podgoretsky © (2003-12-26 13:02) [9]Иван Шихалев © (26.12.03 12:37) [3]
Не обязан, но Паскаль имеет поддержку файлов, может и лишнее.
← →
Иван Шихалев © (2003-12-26 13:04) [10]> Не обязан, но Паскаль имеет поддержку файлов, может и лишнее.
ИМХО, очень даже лишнее. Сильно замутняет понимание при изучении языка.
← →
Goblin (2003-12-26 13:22) [11]>Иван Шихалев © (26.12.03 13:04) [10]
И что новичкам делать на апях писать?
← →
Anatoly Podgoretsky © (2003-12-26 13:23) [12]Я думаю введено было, чтобы не иметь зависимости от ОС
← →
PVOzerski © (2003-12-26 13:41) [13]Итак (D3):
procedure TForm1.Button1Click(Sender: TObject);
procedure MyCopyFile(const n1,n2:string);
var
f1,f2:file;
buf:pointer;
l,age:cardinal;
begin
system.assign(f1,n1);
system.assign(f2,n2);
reset(f1,1);
age:=FileGetDate(tHandle(pointer(@f1)^));
rewrite(f2,1);
l:=filesize(f1);
getmem(buf,l);
blockread(f1,buf^,l);
blockwrite(f2,buf^,l);
system.close(f1);
FileSetDate(tHandle(pointer(@f2)^),age);
system.close(f2);
freemem(buf);
end;
var
i:longint;
s:string;
t1,t2,t3:tDateTime;
s1,s2,s3:tTimeStamp;
begin
if OpenDialog1.Execute then
begin
s:=OpenDialog1.FileName;
t1:=now;
for i:=1 to 100 do
MyCopyFile(s,"PasCopy"+inttostr(i));
t2:=now;
for i:=1 to 100 do
CopyFile(pChar(s),pChar("ApiCopy"+inttostr(i)),false);
t3:=now;
s1:=DateTimeToTimeStamp(t1);
s2:=DateTimeToTimeStamp(t2);
s3:=DateTimeToTimeStamp(t3);
Edit1.Text:=InttoStr(s2.Time-s1.Time)+" "+InttoStr(s3.Time-s2.Time);
end;
end;
Результаты 5 прогонов:
981 1202
911 982
971 1042
962 1031
981 1072
После смены порядка циклов (сначала CopyFile, потом MyCopyFile) стало:
982 1011
1051 1102
1051 1102
1072 1151
1062 1081
Итак, позволю себе утверждать, что myCopyFile работает по меньшей мере не медленнее.
Единственная тонкость: в написании myCopyFile я употребил знание внутреннего устройства структуры file. Но никакого явного WinAPI!
← →
blackman © (2003-12-26 13:41) [14]>Anatoly Podgoretsky © (26.12.03 13:23) [12]
>Я думаю введено было, чтобы не иметь зависимости от ОС
Лень было делать :)
← →
NeyroSpace © (2003-12-26 13:50) [15]l:=filesize(f1);
getmem(buf,l);
Т.е. Вы считываете в буфер весь файл? А если он 700Мб (фильм)?
← →
ИдиотЪ © (2003-12-26 13:51) [16]а работа с файловыми потоками платформозависима ?
← →
kaif © (2003-12-26 14:00) [17]Кстати API-шная функция копирования файлов крайне медленно работает по сети. Я имел несчастье сравнить работу API-шной функции со стандартной реализацией на C. В одной задаче, где требовалось копирование кучи мелких файлов, а времени разбираться не было - товарищ, работавший на C, быстро написал DLL, а я просто ее статически связал ее с дельфийской программой (проимпортировал).
Потом мы нашли в FAR-е опцию "использовать функцию API для копирования файлов". При ее включении FAR начинал так же медленно копировать файлы. В чем проблема функции CopyFile() так и осталось тогда для меня загадкой...
← →
NeyroSpace © (2003-12-26 14:23) [18]Я тоже писал мелкую программульку для копирования файлов по сети, но делал копирование при помощи паскальных ф-ций, т.е. читал в буфер потом писал. Программа работала, но мне стал интересен вопрос: а зависит ли скорость передачи от размера буфера. Чисто теоретически я думал, что зависит, т.к. если читать данные маленькими порциями и между порциями делать паузу, то перенаправитель MS Network отправляет неполноразмерный IP пакет (меньше 1492Б для сети Ethernet). Дык вот поигравшись с размером буфера, я заметил не совсем очевидную зависимость. При маленьком размере буфера скорость падала (это понятно), потом при увеличении размера буфера скорость то увеличивалась, то уменьшалась. Кратность размера пакеты была не при чем :-(. Оставил буфер на 65536, при этом вроде бы скорость копирования не уступала скорости копирования виндосовским експлорером.
Видимо у редиректора есть еще свой буфер и как часто он обновляется из сети я не знаю.
← →
DiamondShark © (2003-12-26 14:44) [19]
> Ведь использование вызовов WinApi противоречит концепции
> мультиплатформенности языка
Равно как и вообще использование понятия "файл".
← →
PVOzerski © (2003-12-26 15:31) [20]2NeyroSpace © (26.12.03 13:50) [15]:
>Т.е. Вы считываете в буфер весь файл? А если он 700Мб (фильм)?
Сейчас у нас была задача сравнить простенький вариант. Ну, можно поставить ограничение на длину блока и работать, при надобности, за несколько blockread/blockwrite. Еще один if и один for в моем коде. Думаю, поблочно рабоать должна и CopyFile (хотя исходников Windows не видел :^) ).
Страницы: 1 вся ветка
Текущий архив: 2004.01.16;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.028 c