- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于获取文件的大小,我有这两个函数:
function GetFileSize1(const FileName: TFileName): Int64;
var
iTmp: Int64;
SearchRec: TSearchRec;
begin
iTmp := -1;
if FindFirst(FileName, faAnyFile, SearchRec) = 0 then
begin
iTmp := SearchRec.Size;
System.SysUtils.FindClose(SearchRec);
end;
Result := iTmp;
end;
还有:
function GetFileSize2(const FileName: TFileName): Int64;
var
FileStream: TFileStream;
begin
FileStream := TFileStream.Create(FileName, fmOpenRead);
try
Result := FileStream.Size;
finally
FileStream.Free;
end;
end;
在实践中,它有什么区别?当然,两者都会返回相同的结果,但是什么更可靠、更快速、更安全呢?或者更好的是,首选用途是什么?第一还是第二?非常感谢。
最佳答案
嗯,明显的区别是 GetFileSize2
打开文件,使用 CreateFile
API 获取文件句柄。相反,GetFileSize1
则不会,因为它从文件元数据中读取大小。
所以我希望 GetFileSize1
表现更好。不过,对于许多应用程序来说,性能差异并不重要。更重要的是,在 GetFileSize1
会成功的情况下,GetFileSize2
可能会因共享冲突而失败。所以你真的不应该使用GetFileSize2
。
另请注意,您提供的两个函数在发生错误时的行为有所不同:GetFileSize1
返回 -1,而 GetFileSize2
引发异常。
我个人更喜欢这个版本:
function GetFileSize3(const FileName: string): Int64;
var
fad: TWin32FileAttributeData;
begin
if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then
RaiseLastOSError;
Int64Rec(Result).Lo := fad.nFileSizeLow;
Int64Rec(Result).Hi := fad.nFileSizeHigh;
end;
或者,如果您希望在出现错误时返回 -1,您可以这样写:
function GetFileSize3(const FileName: string): Int64;
var
fad: TWin32FileAttributeData;
begin
if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then
exit(-1);
Int64Rec(Result).Lo := fad.nFileSizeLow;
Int64Rec(Result).Hi := fad.nFileSizeHigh;
end;
感觉这比调用 FindFirstFile 更自然,但这可能只是个人喜好。 FindFirstFile
方法确实没有任何问题。尽管它不需要 iTmp
变量。你可以这样写得更清楚:
function GetFileSize1(const FileName: TFileName): Int64;
var
SearchRec: TSearchRec;
begin
if FindFirst(FileName, faAnyFile, SearchRec) = 0 then
begin
Result := SearchRec.Size;
System.SysUtils.FindClose(SearchRec);
end
else
Result := -1;
end;
更新: @CodeInChaos 对于不打开文件句柄的方法提出了很好的观点。这些方法可能会为硬链接(hard link)文件提供不准确的结果。
关于delphi - FileSize,与这个程序有什么区别以及什么更好用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430927/
我有一个包含 .tcb 和 .tch 文件的文件夹。我需要知道所有 .tcb 文件的大小,分别是所有 .tch 文件的大小。 我确实喜欢这样: 1)我创建了一个临时文件夹,然后: mv *tch te
如果分辨率大于 256x256,有没有办法将图像转换为 ICO 格式? 我找到了几个程序,但没有一个能够转换更大的图像。我需要的尺寸是 1024x1024。 最佳答案 由于宽度和高度在 ICO 图像格
我正在尝试通过 PHP 上传图像。上传时,它应该调整大小,使其尺寸与我在配置 [] 数组中定义的一样大,并且其文件大小也小于或等于我的配置 [] 数组中的预定义值。但不知何故,方法 getFileSi
关于获取文件的大小,我有这两个函数: function GetFileSize1(const FileName: TFileName): Int64; var iTmp: Int64; Searc
我正在尝试使用system.filesize函数来获取delphi中文件的大小,它对于4GB的文件则失败。所以我实现了自己的,将所需的文件作为文件流打开,并获取完美运行的流大小。 这是一个片段
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: PHP – get the size of a directory 我在一个目录中有 5 个文件,它显示文件
好的, 我使用此函数来获取程序中的文件大小,即使对于 4GB 以上的文件,它也能很好地工作。 function FileSize(const PathtoFile: string): Int64; v
我在 JS 中有这个预加载图像的功能: // http://stackoverflow.com/questions/3646036/javascript-preloading-images var p
错误: Warning: filesize() [function.filesize]: stat failed for http://website.com/wp-content/uploads/2
当我运行这段代码时: 我得到结果 10,这是文件中正确的字符数。 但是,由于文件系统 block 比这大得多,我希望文件大小“四舍五入”到更接近 512 字节甚至 1KB。为什么不是? 最佳答案 不
除 IE 之外的任何浏览器是否支持 document.file Size 或同等大小? http://msdn.microsoft.com/en-us/library/ms533752(v=VS.85
我正在编写一个 PHP 页面,它通过抓取现有的 HTML 页面来生成播客提要。一切正常,但我的一个 mp3 文件出现“filesize(): stat failed”错误。据我所知,该文件没有损坏,并
$path = "/////////."; echo filesize( $path ); 结果是 4096 这是什么……失败了? 4096 是从哪里来的? 最佳答案 回答: $path = "///
我注意到当我尝试使用如下路径列出目录的内容时,filesize 不起作用: ../ 例如这个有效: if ($handle = opendir('./')) { while (false !=
我注意到当我尝试使用如下路径列出目录的内容时,filesize 不起作用: ../ 例如这个有效: if ($handle = opendir('./')) { while (false !=
我想在此脚本中显示 1MB 错误消息而不是 1024: http://jsfiddle.net/tyaenm09/37/ 使用带有文件大小扩展名的 jquery-validation 插件。当然,我可
我想为 FTP 下载创建一个进度条。我下载文件的服务器隐藏了所有目录和文件。我想显示下载进度。有什么办法可以获得文件大小吗?这是我当前的代码: FTPclient = new FTPClient
这个问题在这里已经有了答案: Why does integer division in C# return an integer and not a float? (8 个答案) Division
我一直在苦苦思索如何在 PHP 中获取大于等于 2 GB 的文件的有效文件大小。 例子 在这里,我使用 filesize() 函数检查一个 3,827,394,560 字节大的文件的文件大小: ech
代码: var upload = multer({dest:"./uploads"}); app.post("/", upload.single("file"), function (req, res
我是一名优秀的程序员,十分优秀!