Быстрое чтение-запись из файла в Дельфи

Вместо использования радиуса границы, как насчет использования пути обрезки над изображением?

.teamImage { clip-path: circle(50% at 50% 50%) ; }

Более подробная информация здесь: https://developer.mozilla.org/en-US / документы / Web / CSS / клип путь

8
задан Lars Truijens 18 January 2009 в 20:23
поделиться

6 ответов

Вы обычно не должны читать байт файлов для байта. Используйте BlockRead с большим значением (512, или 1024 часто являются лучшими), и используйте его возвращаемое значение для обнаружения, сколько байтов было считано.

Если размер не является слишком большим (и Ваше использование SetLength, кажется, поддерживает это), можно также использовать один вызов BlockRead, читая полный файл сразу. Так, изменяя Ваш подход, это было бы:

AssignFile(myfile,fname);
filesizevalue := GetFileSize(fname);
Reset(myFile, 1);
SetLength(dataarray, filesizevalue);
BlockRead(myFile, dataarray[0], filesizevalue);
CloseFile(myfile);

Возможно, Вы могли также изменить процедуру на булеву функцию под названием OpenAndReadFile и возвратить false, если файл не мог бы быть открыт или считан.

15
ответ дан 5 December 2019 в 04:52
поделиться

Ищите буферизированного потомка TStream. Это сделает Ваш код намного быстрее, поскольку чтение с диска сделано быстро, но можно циклично выполниться через буфер легко. Там являются различными о, или можно записать собственное.

0
ответ дан 5 December 2019 в 04:52
поделиться

Если это - достаточно длинный файл, что, читая его этот путь занимает значимое количество времени, я использовал бы поток вместо этого. Чтение блока будет намного быстрее, и нет никаких циклов для волнения о. Что-то вроде этого:

procedure openfile(fname:string);
var
    myfile: TFileStream;
    filesizevalue:integer;
begin
  filesizevalue:=GetFileSize(fname); //my method
  SetLength(dataarray, filesizevalue);
  myFile := TFileStream.Create(fname);
  try
    myFile.seek(0, soFromBeginning);
    myFile.ReadBuffer(dataarray[0], filesizevalue);
  finally
     myFile.free;
  end;
end;

Кажется из Вашего кода, что Ваш рекордный размер 1 байт длиной. В противном случае затем измените строку чтения на:

  myFile.ReadBuffer(dataarray[0], filesizevalue * SIZE);

или что-то подобное.

3
ответ дан 5 December 2019 в 04:52
поделиться

Если Ваш действительно хотят считать двоичный файл быстро, позвольте окнам волноваться о буферизации ;-) при помощи Файлов С отображенной памятью. Используя это Вы можете простая карта файл к ячейке памяти чтение как, он - массив.

Ваша функция стала бы:

procedure openfile(fname:string);
var
    InputFile: TMappedFile;
begin
  InputFile := TMappedFile.Create;
  try
    InputFile.MapFile(fname);
    SetLength(dataarray, InputFile.Size);
    Move(PByteArray(InputFile.Content)[0], Result[0], InputFile.Size);
  finally
    InputFile.Free;
  end;
end;

Но я предложил бы не использовать глобальную переменную dataarray, но или передайте его как var в параметре или используйте функцию, которая возвращает полученный массив.

procedure ReadBytesFromFile(const AFileName : String; var ADestination : TByteArray);
var
    InputFile : TMappedFile;
begin
  InputFile := TMappedFile.Create;
  try
    InputFile.MapFile(AFileName);
    SetLength(ADestination, InputFile.Size);
    Move(PByteArray(InputFile.Content)[0], ADestination[0], InputFile.Size);
  finally
    InputFile.Free;
  end;
end;

TMappedFile от моего чтения статьи Fast файлов с помощью Размещения в ОЗУ, эта статья также содержит пример того, как использовать его для более "усовершенствованных" двоичных файлов.

16
ответ дан 5 December 2019 в 04:52
поделиться

Это зависит от формата файла. Если это состоит из нескольких идентичных записей, можно решить создать файл того типа записи.

Например:

type
  TMyRecord = record
    fieldA: integer;

    ..
  end;
  TMyFile = file of TMyRecord;

  const
    cBufLen = 100 * sizeof(TMyRecord);
  var
    file: TMyFile;
    i : Integer;

  begin
    AssignFile(file, filename);
    Reset(file);
    i := 0;
    try
      while not Eof(file) do begin
        BlockRead(file, dataarray[i], cBufLen);
        Inc(i, cBufLen);
      end;
    finally
      CloseFile(file);
    end;
  end;
5
ответ дан 5 December 2019 в 04:52
поделиться

Если Вы чувствуете очень bitheaded, можно обойти Win32 в целом и вызвать функцию Встроенного API NT ZwOpenFile (), который в моем неофициальном тестировании действительно сбривает крошечный бит. Иначе я использовал бы решение для Файла Davy С отображенной памятью выше.

0
ответ дан 5 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: