ВУЗ:
Составители:
Рубрика:
40
количество записей необходимо прочитать или записать за одно об -
ращение к файлу . Переменная buf должна иметь длину не меньшую,
чем count∗RecSize байт . Необязательный параметр at содержит коли-
чество реально прочитанных или записанных записей.
Задача 63. Составить программу для копирования файла .
Если задать длину записи ( RecSize ), кратную 512 байт , то ско-
рость копирования будет большая, но так как длина файла в общем
случае не кратна заданной длине записи, то в файле будут присутст -
вовать неполные записи. В частности, если длина файла окажется
меньше RecSize, то созданный в результате копирования файл будет
пустой. Если задать длину записи, равную одному байту, то это по-
зволит точно отразить размер любого файла , так как в этом случае
в файле не могут присутствовать неполные записи, то есть записи с
длиной меньшей, чем RecSize.
Размер одной записи в процедурах reset и rewrite установим
равным 1 байту. В процедурах blockread и blockwrite параметр
count установим равным 10 (запись и считывание будут осуществ-
ляться по 10 записей). Значение параметра count должно быть как
можно больше при копировании больших файлов. В качестве буфера
будем использовать переменную b, являющуюся массивом типа byte,
содержащим 10 элементов.
Для вывода сообщения об окончании переписывания файла будем
использовать процедуру showmessage(str), параметром которой являет -
ся строка выводимого сообщения .
procedure TForm1.Button1Click(Sender: TObject);
var f1, f2:file; at1, at2:integer;
b:array[1..10] of byte;
begin
if not opendialog1.Execute then exit;
assignfile(f1, opendialog1.filename);
if not savedialog1.Execute then exit;
assignfile(f2, savedialog1.filename);
reset(f1, 1); rewrite(f2, 1);
repeat
blockread(f1, b, 10, at1); blockwrite(f2, b, at1, at2);
until at1<10;
label1.Caption:='Исходный файл ' + opendialog1.filename
+ #13 + 'Количество записей ' + inttostr(filesize(f1));
label2.Caption:='Копия ' + savedialog1.filename
+ #13 + 'Количество записей ' + inttostr(filesize(f2));
closefile(f1); closefile(f2);
showmessage('Запись закончена');
end;
Например, пусть копируется файл C:\files\j.dat, содержащий сле-
дующую информацию :
40 количест во за писей н еоб ход им о прочит а т ь или за писа ть за од н о об - ра щен ие к ф а йлу . П ерем ен н а я buf д олж н а им ет ь д лин у н е м ен ьш у ю , чем count∗RecSize б а йт. Необ я за т ельн ый па ра м етр at сод ерж ит коли- чест во реа льн о прочит а н н ых или за писа н н ых за писей. За д а ча 63. Сост а вит ь програ м м у д ля копирова н ия ф а йла . Е сли за д а т ь д лин у за писи ( RecSize ), кра тн у ю 512 б а йт , то ско- рост ь копирова н ия б у д ет б ольш а я , н о т а к ка к д лин а ф а йла в об щем слу ча е н е кра т н а за д а н н ой д лин е за писи, т о в ф а йле б у д у т прису т ст - вова т ь н еполн ые за писи. В ча стн ости, если д лин а ф а йла ока ж ет ся м ен ьш е RecSize, то созд а н н ый в резу льта т е копирова н ия ф а йл б у д ет пу ст ой. Е сли за д а ть д лин у за писи, ра вн у ю од н ом у б а йт у , т о э т о по- зволит точн о отра зить ра зм ер лю б ого ф а йла , т а к ка к в э т ом слу ча е в ф а йле н е м огу т прису т ст вова т ь н еполн ые за писи, т о ест ь за писи с д лин ой м ен ьш ей, чем RecSize. Ра зм ер од н ой за писи в процед у ра х reset и rewrite у ст а н овим ра вн ым 1 б а йт у . В процед у ра х blockread и blockwrite па ра м етр count у ст а н овим ра вн ым 10 (за пись и счит ыва н ие б у д у т осу ществ- ля т ься по 10 за писей). Зн а чен ие па ра м етра count д олж н о б ыт ь ка к м ож н о б ольш е при копирова н ии б ольш их ф а йлов. В ка чест ве б у ф ера б у д ем использова ть перем ен н у ю b, я вля ю щу ю ся м а ссивом т ипа byte, сод ерж а щим 10 э лем ен тов. Для вывод а сооб щен ия об окон ча н ии переписыва н ия ф а йла б у д ем использова т ь процед у ру showmessage(str), па ра м етром кот орой я вля ет - ся строка вывод им ого сооб щен ия . procedure TForm1.Button1Click(Sender: TObject); var f1, f2:file; at1, at2:integer; b:array[1..10] of byte; begin if not opendialog1.Execute then exit; assignfile(f1, opendialog1.filename); if not savedialog1.Execute then exit; assignfile(f2, savedialog1.filename); reset(f1, 1); rewrite(f2, 1); repeat blockread(f1, b, 10, at1); blockwrite(f2, b, at1, at2); until at1<10; label1.Caption:='И сход н ый ф а йл ' + opendialog1.filename + #13 + 'Количест во за писей ' + inttostr(filesize(f1)); label2.Caption:='Копия ' + savedialog1.filename + #13 + 'Количест во за писей ' + inttostr(filesize(f2)); closefile(f1); closefile(f2); showmessage('За пись за кон чен а '); end; На прим ер, пу ст ь копиру ет ся ф а йл C:\files\j.dat, сод ерж а щий сле- д у ю щу ю ин ф орм а цию :