これにGCCバグ55119を投稿しました。
待っている間(!)、以下のコードはMac OS XMountainLionで動作します。Windowsでは、より複雑です。を参照してくださいadainclude/adaint.{c,h}
。
エイダスペック:
with Ada.Directories;
package Large_Files is
function Size (Name : String) return Ada.Directories.File_Size;
end Large_Files;
および本体(一部はからコピーAda.Directories
):
with GNAT.OS_Lib;
with System;
package body Large_Files is
function Size (Name : String) return Ada.Directories.File_Size
is
C_Name : String (1 .. Name'Length + 1);
function C_Size (Name : System.Address) return Long_Long_Integer;
pragma Import (C, C_Size, "large_file_length");
begin
if not GNAT.OS_Lib.Is_Regular_File (Name) then
raise Ada.Directories.Name_Error
with "file """ & Name & """ does not exist";
else
C_Name (1 .. Name'Length) := Name;
C_Name (C_Name'Last) := ASCII.NUL;
return Ada.Directories.File_Size (C_Size (C_Name'Address));
end if;
end Size;
end Large_Files;
およびCインターフェース:
/* large_files_interface.c */
#include <sys/stat.h>
long long large_file_length (const char *name)
{
struct stat statbuf;
if (stat(name, &statbuf) != 0) {
return 0;
} else {
return (long long) statbuf.st_size;
}
}
他のUnixシステムでstruct stat64
使用する必要があるかもしれません。stat64()
通常どおりCインターフェイスをコンパイルして-largs large_files_interface.o
から、gnatmakeコマンドラインに追加します。
編集:x86_64マシンであるMac OS X(およびDebian)ではsizeof(long)
8バイトです。したがって、のコメントadaint.c
は誤解を招くAda.Directories.Size
可能性があり、最大2**63-1を返す可能性があります。