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;
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;
6条答案
按热度按时间vwoqyblh1#
我不确定是否有一个“ Delphi 2010”的方式,但有一个Windows way that doesn't involve FindFirst and all that jazz。
我把这个例程的 Delphi 转换放在一起(在这个过程中,如果您需要的话,修改它来处理〉4GB大小的文件)。
实际上,你可以只使用GetFileSize(),但是这需要一个文件句柄,而不仅仅是一个文件名,并且类似于**GetCompressedFileSize()**的建议,这需要两个变量来调用。**GetFileSize()和GetCompressedFileSize()**都重载了它们的返回值,所以测试成功并确保有效的结果只是稍微有点尴尬。
**GetFileSizeEx()**避免了处理〉4GB文件大小和检测有效结果的细节,但也需要一个文件句柄,而不是一个名称,并且(至少在 Delphi 2009中,我还没有检查2010)没有在VCL中为您声明,您必须提供自己的导入声明。
ou6hu8tu2#
使用印地单位:
ndh0cuux3#
您也可以使用DSiWin32中的DSiFileSize。在“所有”Delphis中工作。它在内部调用CreateFile和GetFileSize。
lmvvr0a84#
我想提几个**纯 Delphi **的方法。虽然我认为 Deltics 为 *Windows平台 * 提供了最高效的解决方案,但有时你只需要依赖RTL,同时也可以编写可移植的代码,在 Delphi for MacOS 或 FreePascal/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
单元集成在一起。fkvaft9z5#
这是一个使用FileSize的简短解决方案,它可以完成以下工作:
据我所知,FileSize只在XE2中可用。
n3schb8v6#