【发布时间】:2015-10-13 01:37:13
【问题描述】:
我正在构建一个 HTTP 服务器,主要是出于学习/好奇的目的,但我遇到了一个以前在 Ada 中从未遇到过的问题。如果我尝试使用 Direct_IO 读取太大的文件,我会收到存储错误:堆栈溢出异常。这几乎不会发生,但是当我请求视频文件时,会抛出异常。
所以我想到了一次读取和发送 1M 字符块的文件,但这给我留下了结束错误,因为大多数文件的长度不会正好是 1M 字符。我也不完全确定我是否做对了,因为之前阅读整个文件就足够了。这是我写的程序:
procedure Send_File(Channel : GNAT.Sockets.Stream_Access; Filepath : String) is
File_Size : Natural := Natural(Ada.Directories.Size (Filepath));
subtype Meg_String is String(1 .. 1048576);
package Meg_String_IO is new Ada.Direct_IO(Meg_String);
Meg : Meg_String;
File : Meg_String_IO.File_Type;
Count : Natural := 0;
begin
loop
Meg_String_IO.Open(File, Mode => Meg_String_IO.In_File, Name => Filepath);
Meg_String_IO.Read(File, Item => Meg);
Meg_String_IO.Close(File);
String'Write(Channel, Meg);
exit when Count >= File_Size;
Count := Count + 1048576;
end loop;
end Send_File;
我曾想过声明两个单独的 Direct_IO 包/字符串大小,其中一个长度为 1048576,而另一个长度为文件长度 mod 1048576,但我不确定如何按顺序使用这两个阅读器.
感谢任何可以提供帮助的人。
【问题讨论】: