Delphi also provides us with tools to read and write typed and untyped binary files.
Here is an example :
A D V E R T I S E M E N T
var
myFile: File;
byteArray : array[1..8] of byte;
oneByte : byte;
i, count: Integer;
begin
// Try to open the Test.byt file for
writing to
AssignFile(myFile, 'Test.byt');
ReWrite(myFile, 4); // Define a single
'record' as 4 bytes
// Fill out the data array
for i := 1 to 8 do
byteArray[i] := i;
// Write the data array to the file
BlockWrite(myFile, byteArray, 2); // Write 2
'records' of 4 bytes
// Fill out the data array with different data
for i := 1 to 4 do
byteArray[i] := i*i;// Value :
1, 4, 9, 16
// Write only the first 4 items from the data
array to the file
BlockWrite(myFile, byteArray, 1); // Write 1
record of 4 bytes
// Close the file
CloseFile(myFile);
// Reopen the file for reading only
FileMode := fmOpenRead;
Reset(myFile, 1); // Now we define one record
as 1 byte
// Display the file contents
// Start with a read of the first 6 bytes.
'count' is set to the
// actual number read
ShowMessage('Reading first set of bytes :');
BlockRead(myFile, byteArray, 6, count);
// Display the byte values read
for i := 1 to count do
ShowMessage(IntToStr(byteArray[i]));
// Now read one byte at a time to the end of
the file
ShowMessage('Reading remaining bytes :');
while not Eof(myFile) do
begin
BlockRead(myFile, oneByte, 1); // Read and
display one byte at a time
ShowMessage(IntToStr(oneByte));
end;
// Close the file for the last time
CloseFile(myFile);
end;
Reading first set of bytes :
1
2
3
4
5
6
Reading remaining bytes :
7
8
1
4
9
16
Other file processing mechanismsTyped binary files provide direct access
methods in addition to sequential reads and writes. Click on a routine name to
learn more:
FilePosGives
the file position in a binary or text file
Seek Moves to a new position in the file
SeekEofSkip
to the end of the current line or file
SeekEoln Skip to the end of the current line or file
Getting information about files and directoriesWe have only covered data
access to files. There are a number of routines that allow you to do all sorts
of things with files and directories that contain them:
ChDir Change the working drive plus path for a specified drive
CreateDir Create a directory
DeleteFileDelete
a file specified by its file name
Erase Erase a file
FileExistsReturns
true if the given file exists
FileSearchSearch
for a file in one or more directories
FileSetDate Set the last modified date and time of a file
Flush Flushes buffered text file data to the file
GetCurrentDir Get the current directory (drive plus directory)
MkDir Make a directory
RemoveDir Remove a directory
RenameRename
a file
RenameFileRename
a file or directory
RmDir Remove a directory
SelectDirectory Display a dialog to allow user selection of a directory
SetCurrentDir Change the current directory
TruncateTruncates
a file size
Using TStringList to read and write text filesThe
TStringListclass is a very useful utility class that works on a lits of strings, each
indexable like an array. The list can be sorted, and supports name/value pair
strings, allowing selection by name or value.
These lists can be furnished from text files in one fell swoop. Here we show a
TStringList object being created, and loaded from a file:
var
fileData : TStringList;// Our
TStringList variable
begin
fileData := TStringList.Create;//
Create the TSTringList object
fileData.LoadFromFile('Testing.txt');// Load
from Testing.txt file
...
We can display the whole file in a Memo box:
memoBox.Text := fileData.Text;
and we can display or process the file with direct access to any line at any
time. In the example code below, we open a text file, reverse all lines in the
file, and then save it back. Not terribly useful, but it shows the power of
TStringList.
var
fileData : TStringList;
saveLine : String;
lines, i : Integer;
begin
fileData := TStringList.Create;//
Create the TSTringList object
fileData.LoadFromFile('Test.txt'); // Load
from Testing.txt file
// Reverse the sequence of lines in the file
lines := fileData.Count;
for i := lines-1
downto (lines div 2) do
begin
saveLine := fileData[lines-i-1];
fileData[lines-i-1] := fileData[i];
fileData[i] := saveLine;
end;
// Now display the file
for i := 0 to lines-1 do
ShowMessage(fileData[i]);
fileData.SaveToFile('Test.txt'); // Save
the reverse sequence file
end;