Delphi - база знаний


Нетипизированные файлы


Нетипизированные файлы



Идем дальше. Есть такое понятие как нетипизированный файл. Это такой файл который содержит разнородные элементы. Например файл EXE - вначале он имеет заголовок, затем двоичный код, в конце какие-то ресурсы. Все части файла имеют разную длину и разную структуру. Тут уже обратится к произвольному элементу сложно, обычно надо вначале узнать где этот элемент находится, подчас это записано в предыдущем куске информации. Работа с такими файлами достаточно сложна и требует вручную разработки алгоритмов его чтения, но в связи гибкостью структуры и компактностью такие файлы составляют большинство. Для работы с нетипизированными файлами используют процедуры BlockRead и BlockWrite, которые позволяют читать/писать произвольное количество байт. Привожу пример пользования этими функциями из справки по Дельфи:

var
FromF, ToF: file;  
NumRead, NumWritten: Integer;  
Buf: array[1..2048] of Char;  
begin
if OpenDialog1.Execute then { Display Open dialog box }  
begin  
AssignFile(FromF, OpenDialog1.FileName);  
Reset(FromF, 1); { Record size = 1 }  
if SaveDialog1.Execute then { Display Save dialog box}  
begin  
AssignFile(ToF, SaveDialog1.FileName); { Open output file }  
Rewrite(ToF, 1); { Record size = 1 }  
Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))+ ' bytes...');  
repeat  
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);  
BlockWrite(ToF, Buf, NumRead, NumWritten);  
until (NumRead = 0) or (NumWritten <> NumRead);  
CloseFile(FromF);  
CloseFile(ToF);  
end;  
end;  
end;

Этот код копирует из одного файла в другой. Замечания по поводу этого метода работы с файлами - плюсы - очень высокая скорость, особенно если размер буффера увеличить до 64kb-512kb, что позволит считывать файл достаточно большими кусками, чтобы обеспечить отсутствие простоев винчестера, к тому же обеспечивается очень высокая гибкость в работе. Минусы - сложность разработки, необходимость вручную писать все детали механизма чтения/записи и интерпретации данных.

Пожалуй на этом можно было бы и завершить описание работы с файлами средствами Паскаля и файловых переменных, но заглянув в Help Дельфей я обнаружил еще несколько функций достойных упоминания.

Erase(f) - удаляет файл
FilePos(f) - возвращает текущую позицию чтения/записи в файл
Flush(f) - сбрасывает кэшированные файловые операции на диск
Rename(f, 'MyNewFileName.txt') - переименование файлов
Truncate(f) - файл обрезается до текущей позиции чтения/записи






Начало  Назад  Вперед