Я бы не использовал ни в Delphi - я бы использовал потоки.Низкоуровневая обработка файлов является грязной и подверженной ошибкам, гораздо лучше использовать процедуры более высокого уровня, если вы можете.
Вы спрашиваете, что быстрее, OpenFile
или CreateFile
.Они в основном одинаковы, но любой метод открытия файла в любом случае будет сопоставлен с системным вызовом, поэтому производительность будет одинаковой независимо от того, как вы это делаете.Более того, когда производительность для открытия файла имеет значение, именно на чтение или запись затрачивается время.
Любые вопросы о производительности трудно ответить без контекста.Ответ для приложения, которое читает тысячи небольших текстовых файлов, отличается от того, который потоковое резервное копирование, например, на ленточный накопитель.
В любом случае, чтобы подчеркнуть мою первоначальную точку, воспользуйтесь преимуществами превосходной инфраструктуры высокого уровнячто Delphi предоставляет, использует потоки, избегает низкоуровневого ввода-вывода и наслаждается!
Итак, как можно использовать поток Delphi?Я попытаюсь проиллюстрировать это на вымышленном примере записи некоторого текста в виде строки в файл.
procedure SaveTextToFile(FileName, Text: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
Try
if Length(Text)>0 then
Stream.WriteBuffer(Text[1], Length(Text)*SizeOf(Char));
Finally
Stream.Free;
End;
end;
Это довольно очевидно.Второй параметр конструктора TFileStream определяет режим файла.Здесь мы хотим создать новый файл, и поэтому, если какое-либо содержимое существует, оно будет удалено.Вы также можете указать общий доступ к файлам с помощью этого параметра.
Код для записи буфера имеет небольшую упрощенную схему, но опять же очень прост.
Загрузка его обратно приводит к почти идентичной процедуре:
function LoadTextFromFile(FileName: string): string;
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
Try
SetLength(Result, Stream.Size div SizeOf(Char));
if Length(Result)>0 then
Stream.ReadBuffer(Result[1], Length(Result)*SizeOf(Char));
Finally
Stream.Free;
End;
end;
Если вы хотите найти файл, вы можете установить свойство Position
потока или вызвать метод Seek()
.Преимущество последнего состоит в том, что вы можете искать из текущей позиции или конечной позиции.
Потоки являются идиоматическими Delphi.Они широко используются в RTL и VCL, а также сторонними библиотеками.Они сообщают об ошибках с исключениями в родной манере Delphi.Есть много разных потоковых классов, которые все происходят от общего предка, и многие подпрограммы принимают этого общего предка.