在Delphi 2010或更高版本中获取文件的大小?

jpf*_*ius 29 delphi file delphi-2010

Delphi 2010有一套很好的新文件访问功能IOUtils.pas(我特别喜欢与日期相关的函数的UTC版本).到目前为止我想念的是类似的东西

TFile.GetSize (const Path : String)
Run Code Online (Sandbox Code Playgroud)

什么是Delphi 2010-获取文件大小的方法?我是否必须返回并使用FindFirst访问TSearchRec.FindData

谢谢.

Del*_*ics 49

我不确定是否有"Delphi 2010"方式,但有一种Windows方式不涉及FindFirst和所有爵士乐.

我把这个例程的Delphi转换(并在此过程中修改它以处理> 4GB大小的文件,如果你需要).

  uses
    WinApi.Windows;

  function FileSize(const aFilename: String): Int64;
  var
    info: TWin32FileAttributeData;
  begin
    result := -1;

    if NOT GetFileAttributesEx(PWideChar(aFileName), GetFileExInfoStandard, @info) then
      EXIT;

    result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32);
  end;
Run Code Online (Sandbox Code Playgroud)

实际上你可以只使用GetFileSize(),但这需要一个文件HANDLE,而不仅仅是文件名,并且类似于GetCompressedFileSize()建议,这需要两个变量来调用.无论GetFileSize()GetCompressedFileSize()重载其返回值,所以测试成功,并确保有效的结果是,只是有点更加尴尬.

GetFileSize Ex()避免了处理> 4GB文件大小和检测有效结果的细节,但也需要文件HANDLE而不是名称,并且(至少Delphi 2009,我没有检查过2010)不是在任何地方为你在VCL宣布,你必须提供自己的进口声明.

  • 对于压缩文件(zip,rar,7z等),它将以字节为单位报告存档的大小,而不是解压缩内容的大小.但对于ZIP文件,文件的大小是存档的大小.对于压缩卷上的文件,它将报告解压缩文件的大小,这是您想要的,因为您要求的是存储对象(文件)的大小而不是物理存储介质(OS强制压缩).对于<4GB的文件,你建议的方法非常复杂,除非你天真地和错误地假设*所有文件总是<4GB (6认同)
  • -1:您的函数不适用于commpessed文件 (2认同)
  • @Deltics这不对!这不会返回大于4GB的大小.请参阅[如何从shl获得大于4gb的结果](http://stackoverflow.com/questions/8127693/how-can-i-get-a-result-larger-than-232-from-shl)或使用LARGE_INTEGER. (2认同)
  • @rvheddeg。当然有房间了 我设法将所有重要信息都包括在“更正”中,同时还要感谢,还有余地。您无条件的说法,答案是“不正确!” 链接到另一个问题,却没有任何说明为什么有意义的链接,实际上并没有太大帮助。尤其是因为答案虽然有错误,但从根本上来说是正确的,而至关重要的是现在是完全正确的,您的评论读者无法确定。否则我绝对*会*赞成。祝你有美好的一天。 (2认同)
  • 你也可以做`Int64Rec(Result).Lo:= Info.nFileSizeLow; Int64Rec(Result).Hi:= Info.nFileSizeHigh;` (2认同)

tz.*_*tz. 7

使用Indy单位:

uses IdGlobalProtocols;

function FileSizeByName(const AFilename: TIdFileName): Int64;
Run Code Online (Sandbox Code Playgroud)

  • 如果`FileSizeByName()`返回0,那么这是OS报告的实际大小,因为`FileSizeByName()`如果发生错误则返回-1,如果文件不存在或无法访问. (2认同)