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

在Delphi 2010或更高版本中获取文件大小?,delphi,file,delphi-2010,Delphi,File,Delphi 2010,Delphi2010在IOUtils.pas中有一组很好的新文件访问函数(我特别喜欢UTC版本的日期相关函数)。到目前为止,我所怀念的是 TFile.GetSize (const Path : String) Delphi2010获取文件大小的方法是什么?我是否必须返回并使用FindFirst访问TSearchRec.FindData 谢谢。我不确定是否有“德尔福2010”的方法,但有一种方法 我将该例程的这个Delphi转换组合在一起(在这个过程中,如果您需要的话,修改它以处理>4GB大小的

Delphi2010在
IOUtils.pas
中有一组很好的新文件访问函数(我特别喜欢UTC版本的日期相关函数)。到目前为止,我所怀念的是

TFile.GetSize (const Path : String)
Delphi2010获取文件大小的方法是什么?我是否必须返回并使用FindFirst访问
TSearchRec.FindData

谢谢。

我不确定是否有“德尔福2010”的方法,但有一种方法

我将该例程的这个Delphi转换组合在一起(在这个过程中,如果您需要的话,修改它以处理>4GB大小的文件)

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


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

您也可以从中使用DSiFileSize。在“所有”德尔菲工作。它在内部调用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 }
使用Indy装置:

uses IdGlobalProtocols;

function FileSizeByName(const AFilename: TIdFileName): Int64;

我想提几个纯德尔菲的方法。虽然我认为Deltics为Windows平台提供了一个最快速有效的解决方案,但有时您只需要依赖RTL,还需要生成可移植的代码,这些代码可以在Delphi for MacOS或FreePascal/Virtual Pascal/whatever中工作


Turbo Pascal days还剩下
FileSize
功能

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

它不适用于2GB以上的文件(可能是负数到基数的转换,最高可达4GB),但它是“开箱即用”的


还有一种方法,如果您曾经为MS-DOS进行过ASM编程,您可能会很熟悉。您可以
查找指向第一个字节的文件指针,然后查找最后一个字节,并检查差异。
我不能确切地说是哪个Delphi版本引入了这些,但我认为它已经出现在一些古老的版本中,如D5或D7,尽管这只是常识,我无法检查。
这将需要一个额外的THandle变量,
最后尝试
块在获得大小后始终关闭句柄

除了第一次进近之外,它还支持int64。 它也与FreePascal兼容,尽管有一些限制


您还可以创建和使用
TFileStream
-类型化对象,该对象是主要的,自
Delphi 1.0以来一直是文件操作的官方途径

作为旁注,这条路当然与前面提到的
IOUtils
单元集成在一起


这是一个简短的解决方案,使用文件大小来完成此任务:

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中可用。

刚刚查看了JEDI代码库中的FileGetSize函数。事实上,它也只是使用FindFirst方法。@J_uuu为什么不回答呢?添加到JCL wiki和JCL下载的链接-这将构成一个好的catchPlease,投票给Smasher并没有解释会得到什么样的文件大小。对于压缩文件(zip、rar、7z等),它将以字节为单位报告存档的大小,而不是解压缩内容的大小。但是对于ZIP文件,文件的大小就是归档文件的大小。对于压缩卷上的文件,它将报告解压缩文件的大小,这是您想要的,因为您要求的是存储对象(文件)的大小,而不是物理存储介质(操作系统强制压缩)的大小。对于<4GB的文件,您建议的方法非常复杂,除非您天真地错误地假设所有文件总是<4GB4GB@Deltics这是不对的!这不会返回大于4GB的大小。请查看或使用大的_整数。@rvheddeg。你当然有房间。我设法把所有重要的信息都写进了“更正”中,加上感谢,还有剩余的空间。你无保留地说答案是“不正确的!”并链接到另一个问题,但没有说明为什么它是相关的,这实际上没有多大帮助。不仅是因为答案基本上是正确的,尽管有一个bug,而且关键的是现在是完全正确的,这是读者无法确定的。否则我绝对会把票投得更高。祝你度过愉快的一天。你也可以做
Int64Rec(Result)。Lo:=Info.nFileSizeLow;Int64Rec(Result).Hi:=Info.nFileSizeHigh
在2010 delphi的TXT文件中返回0。如果
FileSizeByName()
返回0,则这是操作系统报告的实际大小,因为如果发生错误,
FileSizeByName()
将返回-1,例如,如果文件不存在或无法访问。我不确定TFileStream是否被批准滥用,因为它是一个正式的目录,而不是文件操作。Findfirst作为首选路线更有意义。值得怀疑。我不想查找任何内容,也不想创建并处理文件搜索基础结构。我只想查询一个特定的文件。然后,如果该文件不是唯一的,并且您确实希望收集大量文件的大小(例如目录列表),那么就查找FindFirst或其他文件
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;
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;