Работа с файлами в Delphi: чтение и запись с использованием FileRead, FileWrite, TFileStream и буферизация
В процессе разработки на Delphi часто возникает необходимость работы с файлами, в том числе с чтением и записью больших объемов данных. Для этого в Delphi предусмотрены различные средства, включая процедуры FileRead, FileWrite и компонент TFileStream, который позволяет работать с файлами в буферном режиме.
Чтение файла в строку
Для начала рассмотрим простой способ чтения содержимого текстового файла в строку. Можно использовать компонент TStringList, который позволяет работать с файлом построчно:
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('C:\myfile.txt');
// Строка содержит все содержимое файла, включая разделители строк
var oldString := sl.Text;
// Манипуляции со строкой
sl.Text := 'Новый текст файла';
// Запись измененной строки обратно в файл
sl.SaveToFile('C:\myfile.txt');
finally
sl.Free;
end;
end;
Однако стоит помнить, что TStringList может изменять разделители строк в зависимости от платформы, поэтому при работе с мультиплатформенными приложениями следует учитывать этот момент.
Использование TStringStream
Если требуется обращаться с файлом как с единым блоком данных, можно использовать TStringStream, который позволяет читать и записывать файлы как строки:
var
Stream: TStringStream;
begin
Stream := TStringStream.Create('', TEncoding.UTF8);
try
Stream.LoadFromFile('C:\Desktop\In.txt');
// Получение содержимого файла как строки
ShowMessage(Stream.DataString);
// Очистка потока и запись новой строки
Stream.Clear;
Stream.WriteString('Новый текст файла');
// Запись измененной строки обратно в файл
Stream.SaveToFile('C:\Desktop\Out.txt');
finally
Stream.Free;
end;
end;
Работа с FileRead, FileWrite и буферизация
Для более низкоуровневой работы с файлами можно использовать процедуры FileRead и FileWrite, а также буферизацию данных:
const
FileName = 'Unit14.pas';
var
Stream: TFileStream;
Buffer: RawByteString;
begin
Stream := TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
try
// Чтение всего файла в буфер
SetLength(Buffer, Stream.Size);
Stream.ReadBuffer(Buffer[1], Stream.Size);
// Манипуляции с данными в буфере
// ...
// Перемещение указателя файла на начало
Stream.Position := 0;
// Обнуление размера файла
Stream.Size := 0;
// Запись данных из буфера обратно в файл
Stream.WriteBuffer(Buffer[1], Length(Buffer));
finally
Stream.Free;
end;
end;
Или, используя низкоуровневые функции ввода-вывода:
var
Handle: Integer;
Size: Cardinal;
Buffer: RawByteString;
Transferred: Integer;
begin
Handle := FileOpen(FileName, fmOpenReadWrite or fmShareExclusive);
try
// Чтение всего файла в буфер
Size := GetFileSize(Handle, nil);
SetLength(Buffer, Size);
Transferred := FileRead(Handle, Buffer[1], Size);
// Манипуляции с данными в буфере
// ...
// Перемещение указателя файла на начало
FileSeek(Handle, 0, 0);
// Обнуление файла
SetEndOfFile(Handle);
// Запись данных из буфера обратно в файл
Transferred := FileWrite(Handle, Buffer[1], Length(Buffer));
finally
FileClose(Handle);
end;
end;
Заключение
В зависимости от задачи, может быть удобнее использовать TStringList, TStringStream, TFileStream, или низкоуровневые функции ввода-вывода. Важно учитывать особенности работы с кодировками и платформенную совместимость, а также использовать буферизацию для оптимизации процесса чтения и записи больших объемов данных.
Процесс работы с файлами в Delphi включает использование различных методов и компонентов для чтения и записи данных, с возможностью буферизации для эффективной обработки больших файлов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.