S
stevenldj
Unregistered / Unconfirmed
GUEST, unregistred user!
想找个功能强大的函数(获取文件大小),能实现以下要求的功能:
1、能获取锁定文件的大小( 比如 C:/PageFile.sys )
2、能获取超过 4GB 的文件的大小( 比如虚拟机的 虚拟磁盘 文件 *.vmdk )
说明:这样的功能,系统自身可以实现,查看文件的属性就知道了。
还有一个软件 TotalSize 也能实现。
那要怎么用 Delphi 来实现呢?
下面是我现在使用的函数,不过都不完美,谁能给个完美的函数,谢谢了!!!
(100分)
======================================================================
//获取文件夹大小
function uGetDirSize(sDirName: string): Int64;
var
sFullName, sName: string;
SearchRec: TSearchRec;
begin
Result := 0;
//格式化路径
if sDirName[Length(sDirName)] <> '/' then sDirName := sDirName + '/';
if FindFirst(sDirName + '*.*', faAnyFile, SearchRec) = 0 then begin
repeat
sName := SearchRec.Name;
if sName[1] = '.' then Continue; //过滤无用信息
sFullName := sDirName + sName;
if (SearchRec.Attr and faDirectory) = faDirectory then
Result := Result + uGetDirSize(sFullName) //递归调用
else begin
Result := Result + SearchRec.Size;
//Result := Result + uGetFileSize(sFullName); //想找个能操作大于4G文件的函数
end;
until FindNext(SearchRec) <> 0
end;
FindClose(SearchRec);
end;
//获取文件大小(文件大小不能超过4G),超过4G将得到错误结果,错误结果不一定为负数。
function uGetFileSize(sFileName: string): Int64;
var
SearchRec: TSearchRec;
begin
Result := 0;
if FindFirst(sFileName, faAnyFile, SearchRec) = 0 then begin
if (SearchRec.Attr and faDirectory) = faDirectory then
Exit
else
Result := SearchRec.Size;
end;
FindClose(SearchRec);
end;
//获取文件大小(文件大小可以超过4G),但不能操作锁定的文件(比如 PageFile.sys ),否则返回0大小
function uGetFileSize1(sFileName: string): Int64;
var
hFile: THandle;
begin
Result := 0;
hFile := FileOpen(sFileName, fmOpenRead);
if hFile <> INVALID_HANDLE_VALUE then
try
Result := FileSeek(hFile, 0, 2);
finally
FileClose(hFile);
end;
end;
//获取文件大小(文件大小可以超过4G),但不能操作锁定的文件(比如 PageFile.sys ),否则会抛出读取异常
function uGetFileSize2(sFileName: string): Int64;
var
F: TFilestream;
begin
Result := 0;
F := TFilestream.Create(sFileName, fmOpenRead);
Result := F.Size;
F.Free;
end;
1、能获取锁定文件的大小( 比如 C:/PageFile.sys )
2、能获取超过 4GB 的文件的大小( 比如虚拟机的 虚拟磁盘 文件 *.vmdk )
说明:这样的功能,系统自身可以实现,查看文件的属性就知道了。
还有一个软件 TotalSize 也能实现。
那要怎么用 Delphi 来实现呢?
下面是我现在使用的函数,不过都不完美,谁能给个完美的函数,谢谢了!!!
(100分)
======================================================================
//获取文件夹大小
function uGetDirSize(sDirName: string): Int64;
var
sFullName, sName: string;
SearchRec: TSearchRec;
begin
Result := 0;
//格式化路径
if sDirName[Length(sDirName)] <> '/' then sDirName := sDirName + '/';
if FindFirst(sDirName + '*.*', faAnyFile, SearchRec) = 0 then begin
repeat
sName := SearchRec.Name;
if sName[1] = '.' then Continue; //过滤无用信息
sFullName := sDirName + sName;
if (SearchRec.Attr and faDirectory) = faDirectory then
Result := Result + uGetDirSize(sFullName) //递归调用
else begin
Result := Result + SearchRec.Size;
//Result := Result + uGetFileSize(sFullName); //想找个能操作大于4G文件的函数
end;
until FindNext(SearchRec) <> 0
end;
FindClose(SearchRec);
end;
//获取文件大小(文件大小不能超过4G),超过4G将得到错误结果,错误结果不一定为负数。
function uGetFileSize(sFileName: string): Int64;
var
SearchRec: TSearchRec;
begin
Result := 0;
if FindFirst(sFileName, faAnyFile, SearchRec) = 0 then begin
if (SearchRec.Attr and faDirectory) = faDirectory then
Exit
else
Result := SearchRec.Size;
end;
FindClose(SearchRec);
end;
//获取文件大小(文件大小可以超过4G),但不能操作锁定的文件(比如 PageFile.sys ),否则返回0大小
function uGetFileSize1(sFileName: string): Int64;
var
hFile: THandle;
begin
Result := 0;
hFile := FileOpen(sFileName, fmOpenRead);
if hFile <> INVALID_HANDLE_VALUE then
try
Result := FileSeek(hFile, 0, 2);
finally
FileClose(hFile);
end;
end;
//获取文件大小(文件大小可以超过4G),但不能操作锁定的文件(比如 PageFile.sys ),否则会抛出读取异常
function uGetFileSize2(sFileName: string): Int64;
var
F: TFilestream;
begin
Result := 0;
F := TFilestream.Create(sFileName, fmOpenRead);
Result := F.Size;
F.Free;
end;