Delphi-альтернативы некоторым функциям File I / O C ++ lib? - PullRequest
1 голос
/ 16 марта 2011
  • fopen_s <-> OpenFile
  • fclose <-> CloseFile

Верно ли мое предположение?

Интересно, что лучшеиспользовать, OpenFile или CreateFile.Последнее дает больше свободы, но быстрее ли?

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Я бы не использовал ни в 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.Есть много разных потоковых классов, которые все происходят от общего предка, и многие подпрограммы принимают этого общего предка.

3 голосов
/ 16 марта 2011

Низкоуровневая обработка файла Delphi выполняется следующим образом:

procedure Proc;
var
  f: file; // or f: TextFile;
begin
  FileMode := fmOpenRead; // or fmOpenWrite or fmOpenReadWrite
  AssignFile(f, 'C:\file.txt');
  try
    // Reset/Rewrite
    // A number of BlockRead/BlockWrite/ReadLn/WriteLn...
  finally
    CloseFile(f);
  end;
end;

Это классический способ работы с файлами в Delphi, и это то, что соответствует функциям C ++.

OpenFile и CreateFile являются , а не функциями Delphi, поэтому они не могут соответствовать функциям C ++. Вместо этого это функции Windows API, который доступен на всех (Windows) языках программирования. Первый, OpenFile, не рекомендуется. Вместо этого используйте CreateFile . Но если вы используете функции обработки файлов Windows API для открытия / создания файла, вы должны также использовать их для чтения / записи файла, например, ReadFile , и вы должны завершить работу с помощью функции CloseHandle .

Обратите внимание, в частности, что OpenFile - это функция Windows API, тогда как CloseFile - это функция Delphi RTL, поэтому вы даже не можете использовать их вместе! Delphi: AssignFile -> CloseFile; Windows API: CreateFile -> CloseHandle.

Вы также должны знать, что есть высокоуровневые функции для управления файлами в Delphi RTL (библиотека времени выполнения). Я уверен, что другие пользователи будут продвигать их.

2 голосов
/ 16 марта 2011

Прошло много времени с тех пор, как я занимался программированием на Delphi, но я помню, что файловый ввод-вывод гораздо лучше обслуживался с использованием набора классов TStream (TFileStream для файлового ввода-вывода). По сути, они являются эквивалентным механизмом библиотеки потоков ввода-вывода C ++, что, конечно, является предпочтительным способом выполнения файлового ввода-вывода в C ++. См. этот простой пример и эту вики .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...