为什么获取文件夹容量大小不准确(包含递归) ( 积分: 50 )

  • 主题发起人 主题发起人 yjpya
  • 开始时间 开始时间
Y

yjpya

Unregistered / Unconfirmed
GUEST, unregistred user!
各位朋友,函数如下,但下面的函数获取文件夹大小的时候,有时候准确,有时候不准确,不知道是什么原因,当获取Windows目录的容量大小的时候就不准确了,哪位朋友能帮忙改一改,可以使其无论获取什么文件夹都可以准确,即使这个文件夹里面包括隐藏文件夹或隐藏文件,谢谢。
function TGet_Size.GetDirectorySize(Path: string): Double; //eg. Path = 'c:/temp/'
var
SR: TSearchRec;
begin
Result := 0;
if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
begin
if (sr.Name <> '.') and (sr.Name <> '..') and (sr.Attr = faDirectory) then
begin
Result := Result + GetDirectorySize(Path + Sr.Name + '/');
end
else
begin
Result := Result + Sr.Size;
end;
while FindNext(sr) = 0 do
if (sr.Name <> '.') and (sr.Name <> '..') and (sr.Attr = faDirectory) then
begin
Result := Result + GetdirectorySize(Path + Sr.Name + '/');
end
else
begin
Result := Result + Sr.Size;
end;
FindClose(sr);
end;
end;
 
最好取一个固定文件夹的大小,不要取一些有程序正在访问的文件夹。否则可能有影响。
 
有个问题,为啥用Double作为返回值?字节数还有零点几个byte??另外,你注意看Sr.Size,是Integer类型的,遇到大于2G的文件就不准了。
 
FindFirst那一套函数,MS已经出了一套“升级版”函数,可以参考MSDN里的 FindFirstFile ;
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH];
TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA,
*PWIN32_FIND_DATA;

它是通过nFileSizeHigh、nFileSizeLow来表示大于4G的文件的。
好像Delphi没有这些定义吧,可以自己写,也可以到网上找找。
 
用 Win32 API
 
楼上的朋友,能不能再详细一点呢,希望可以有更进一步的指点,谢谢
 
http://www.2ccc.com/article.asp?articleid=3740
这是俺的源程序,虽然不是用来演示统计文件夹大小的,但其中有代码能显示搜索过的所有文件大小累加的容量。见图片上的“搜索空间”下面显示的容量:
zpG1ie-smjv6BZNYErTPqJSjBORxIqOj.gif
 
最后编辑:
function GetDirectorySize(Path: string): Int64;
var
wfd: TWin32FindData;
handle:THandle;
begin
Result := 0;
handle := 0;

wfd.dwFileAttributes := faAnyFile or faSymLink;
handle := FindFirstFile(PChar(Path + '*.*'), wfd);
if handle<>0 then
begin
repeat
if (PChar(@wfd.cFileName) <> '.') and (wfd.cFileName <> '..') and (wfd.dwFileAttributes = faDirectory) then
begin
Result := Result + GetdirectorySize(Path + wfd.cFileName + '/');
end
else
begin
Result := Result + (wfd.nFileSizeHigh shl 32) +wfd.nFileSizeLow;
end;
until not FindNextFile(handle,wfd);
end;
end;

我试了,确实有些文件夹在windows下看的容量和递归加出来的容量不同,特别是带有文件夹的。
 
后退
顶部