在Delphi 2010或更高版本中获取文件大小?
Delphi2010在在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大小的
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
功能
ReSet
之前,应该为FileMode
global var分配零
还有一种方法,如果您曾经为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;