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

8yparm6h  于 2023-01-20  发布在  其他
关注(0)|答案(6)|浏览(182)

Delphi 在IOUtils.pas中有一组不错的新文件访问函数(我特别喜欢UTC版本的日期相关函数)。

TFile.GetSize (const Path : String)

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

vwoqyblh

vwoqyblh1#

我不确定是否有一个“ Delphi 2010”的方式,但有一个Windows way that doesn't involve FindFirst and all that jazz
我把这个例程的 Delphi 转换放在一起(在这个过程中,如果您需要的话,修改它来处理〉4GB大小的文件)。

uses
    WinApi.Windows;

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

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

    result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32);
  end;

实际上,你可以只使用GetFileSize(),但是这需要一个文件句柄,而不仅仅是一个文件名,并且类似于**GetCompressedFileSize()**的建议,这需要两个变量来调用。**GetFileSize()GetCompressedFileSize()**都重载了它们的返回值,所以测试成功并确保有效的结果只是稍微有点尴尬。

**GetFileSizeEx()**避免了处理〉4GB文件大小和检测有效结果的细节,但也需要一个文件句柄,而不是一个名称,并且(至少在 Delphi 2009中,我还没有检查2010)没有在VCL中为您声明,您必须提供自己的导入声明。

ou6hu8tu

ou6hu8tu2#

使用印地单位:

uses IdGlobalProtocols;

function FileSizeByName(const AFilename: TIdFileName): Int64;
ndh0cuux

ndh0cuux3#

您也可以使用DSiWin32中的DSiFileSize。在“所有”Delphis中工作。它在内部调用CreateFile和GetFileSize。

function DSiFileSize(const fileName: string): int64;
  var
    fHandle: DWORD;
  begin
    fHandle := CreateFile(PChar(fileName), 0, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if fHandle = INVALID_HANDLE_VALUE then
      Result := -1
    else try
      Int64Rec(Result).Lo := GetFileSize(fHandle, @Int64Rec(Result).Hi);
    finally CloseHandle(fHandle); end;
  end; { DSiFileSize }
lmvvr0a8

lmvvr0a84#

我想提几个**纯 Delphi **的方法。虽然我认为 Deltics 为 *Windows平台 * 提供了最高效的解决方案,但有时你只需要依赖RTL,同时也可以编写可移植的代码,在 Delphi for MacOSFreePascal/Virtual Pascal/whatever 中工作。
FileSize函数离开Turbo Pascal天。

上面的示例缺少“只读”模式设置。要打开r/o文件(例如CD-ROM介质上的文件或ACL设置为r/o的文件夹中的文件),您需要该设置。在调用ReSet之前,应为FileMode全局变量分配零。

它不会工作的文件超过2GB的大小(也许与负向基数铸造-高达4GB),但是“开箱即用”的一个。
还有一种方法,如果你曾经为MS-DOS做过ASM编程,你可能会很熟悉。你把Seek文件指针指向第一个字节,然后指向最后一个字节,检查它们的区别。
我不能确切地说是哪个 Delphi 版本引入了这些,但我认为它已经在一些古老的版本中,如D5或D 7,尽管这只是常识,我不能检查它。
这将需要额外的THhandle变量和try-finally块,以便在获得size后始终关闭句柄。

除了第一种方法外,它还支持int 64,并且与FreePascal兼容,尽管有一些限制

您还可以创建和使用TFileStream类型的对象,它是自Delphi 1.0以来主要的文件操作途径**,并得到官方的祝福

顺便说一句,这种方法当然与前面提到的IOUtils单元集成在一起。

fkvaft9z

fkvaft9z5#

这是一个使用FileSize的简短解决方案,它可以完成以下工作:

function GetFileSize(p_sFilePath : string) : Int64;
var
  oFile : file of Byte;
begin
  Result := -1;
  AssignFile(oFile, p_sFilePath);
  try
    Reset(oFile);
    Result := FileSize(oFile);
  finally
    CloseFile(oFile);
  end;
end;

据我所知,FileSize只在XE2中可用。

n3schb8v

n3schb8v6#

uses
  System.Classes, System.IOUtils;

function GetFileSize(const FileName : string) : Int64;
var
  Reader: TFileStream;
begin
  Reader := TFile.OpenRead(FileName);
  try
    result := Reader.Size;
  finally
    Reader.Free;
  end;
end;

相关问题