Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-49592
_Mad_
2004-01-05 13:08
2004.01.16
масвсив случайных чисел


4-49808
Gerda
2003-11-12 22:26
2004.01.16
Как получить ссылку на иконку окна


1-49502
Юрий Зотов
2004-01-06 12:00
2004.01.16
Прорисовка заголовка окна в различных стилях.


3-49460
vvh
2003-12-18 00:45
2004.01.16
Какие ограничения на количество записей в таблицах IB


3-49398
x_x_x
2003-12-19 16:34
2004.01.16
ADO и dBase