Sie sollten Dateien nicht Byte für Byte lesen. Verwenden Sie BlockRead mit einem größeren Wert (512 oder 1024 sind oft am besten) und verwenden Sie den Rückgabewert, um herauszufinden, wie viele Bytes gelesen wurden.
Wenn die Größe nicht zu groß ist (und Ihre Verwendung von SetLength scheint dies zu unterstützen), können Sie auch einen BlockRead-Aufruf verwenden, bei dem die gesamte Datei gleichzeitig gelesen wird. Wenn Sie also Ihren Ansatz ändern, wäre dies:
%Vor%Vielleicht könnten Sie die Prozedur auch in eine boolesche Funktion namens OpenAndReadFile ändern und false zurückgeben, wenn die Datei nicht geöffnet oder gelesen werden konnte.
Wenn Sie eine Binärdatei wirklich schnell lesen wollen, lassen Sie Windows sich Gedanken über die Pufferung machen ;-) mit Speicherzugewiesene Dateien . Damit können Sie eine Datei einfach an einen Speicherort ablegen und sie lesen, als wäre es ein Array.
Ihre Funktion wäre:
%Vor% Aber ich würde vorschlagen, die globale Variable dataarray
nicht zu verwenden, sondern sie entweder als Var im Parameter zu übergeben oder eine Funktion zu verwenden, die das resultierende Array zurückgibt.
Die TMappedFile stammt aus meinem Artikel Fast Lesen von Dateien mit Memory Mapping , dieser Artikel enthält auch ein Beispiel, wie man es für "fortgeschrittenere" Binärdateien verwenden kann.
Das hängt vom Dateiformat ab. Wenn es aus mehreren identischen Datensätzen besteht, können Sie eine Datei dieses Datensatztyps erstellen.
Zum Beispiel:
%Vor%Wenn es eine Datei ist, die lange genug ist, dass das Lesen auf diese Weise eine merkliche Menge an Zeit benötigt, würde ich stattdessen einen Stream verwenden. Der gelesene Block wird viel schneller sein, und es gibt keine Schleifen, über die man sich Sorgen machen muss. Etwas wie das:
%Vor%Aus Ihrem Code geht hervor, dass Ihre Datensatzgröße 1 Byte lang ist. Wenn nicht, ändern Sie die Leseleitung zu:
%Vor%oder etwas ähnliches.
Wenn Sie sich sehr benommen fühlen, können Sie Win32 umgehen und die NT-Native-API-Funktion ZwOpenFile () aufrufen, die bei meinen informellen Tests ein kleines bisschen abrasiert. Ansonsten würde ich Davys Memory Mapped File-Lösung oben verwenden.