数MBのバイナリファイルの内容を読み込み、バッファに格納したいと考えています。これが私の関数プロトタイプです(必要に応じて変更できます):
procedure GET_BIN_CONTENT_FROM_PATH(PATH : in UNBOUNDED_STRING;
CONTENT : out UNBOUNDED_STRING);
これまで、Direct_IO パッケージを使用して 2 つの方法を試してきました。最初の方法では、ファイルを 1 文字ずつ読み取っていました。それは機能しましたが、非常に遅かったです。プロセスを高速化するために、ファイルを MB 単位で読み取ろうとしました。
procedure GET_BIN_CONTENT_FROM_PATH (PATH : in UNBOUNDED_STRING;
CONTENT : out UNBOUNDED_STRING) is
BIN_SIZE_LIMIT : constant NATURAL := 1000000;
subtype FILE_STRING is STRING (1 .. BIN_SIZE_LIMIT);
package FILE_STRING_IO is new ADA.DIRECT_IO (FILE_STRING);
FILE : FILE_STRING_IO.FILE_TYPE;
BUFFER : FILE_STRING;
begin
FILE_STRING_IO.OPEN (FILE, MODE => FILE_STRING_IO.IN_FILE,
NAME => TO_STRING (C_BASE_DIR & PATH));
while not FILE_STRING_IO.END_OF_FILE (FILE) loop
FILE_STRING_IO.READ (FILE, ITEM => BUFFER);
APPEND (CONTENT, BUFFER);
end loop;
FILE_STRING_IO.CLOSE (FILE);
end GET_BIN_CONTENT_FROM_PATH;
残念ながら、ファイルの残りが 1MB 未満の場合、READ 操作は行われないようです。その結果、大きなファイル (>1MB) は切り捨てられ、小さなファイルはまったく読み取られません。これは、画像を扱うときに特に顕著です。
だから、私の質問は次のとおりです。バイナリファイルをすばやく完全に読み取る正しい方法は何ですか?
前もって感謝します。