📄 foldersizethreadunit.pas
字号:
unit FolderSizeThreadUnit;
interface
uses
Classes, Windows, SysUtils;
type
TFolderSizeThread = class(TThread)
private
{ Private declarations }
sFolderName:String;
timeAfter:TDateTime;
dirSizeTotal:real;
dirSizeTotalAll:real;
dirNumber:integer;
fileNumber:integer;
fileNumberTrue: integer;
procedure GetFolserSizeDone(sDirName:String;sTime:TDateTime; var SizeTotalTrue,SizeTotal:real; var fileSumTrue, fileSum, folderSum:integer);
procedure GetFolserSize;
protected
procedure Execute; override;
public
constructor Create(_sFolderName:String; _timeAfter:TDateTime);
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TFolderSizeThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TFolderSizeThread }
uses
FileTestUnit, TestFunctionUnit;
constructor TFolderSizeThread.Create(_sFolderName:String; _timeAfter:TDateTime);
begin
sFolderName:=_sFolderName;
timeAfter:=_timeAfter;
dirSizeTotal:=0;
dirSizeTotalAll:=0;
dirNumber:=0;
fileNumber:=0;
fileNumberTrue:=0;
inherited Create(True);
end;
procedure TFolderSizeThread.GetFolserSizeDone(sDirName:String;sTime:TDateTime; var SizeTotalTrue,SizeTotal:real; var fileSumTrue, fileSum, folderSum:integer);
var
hFindfile:Cardinal;
tfile:String;
sCurDir:String[255];
FindFileData:WIN32_FIND_DATA;
getstr:String;
begin
//先保存当前目录
sCurDir:=GetCurrentDir;
ChDir(sDirName);
hFindfile:=FindFirstFile('*.*',FindFileData);
if hFindFile<>INVALID_HANDLE_VALUE then
begin
repeat
tfile:=FindFileData.cFileName;
if (tfile='.') or (tfile='..') then
Continue;
//if (FindFileData.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY) or (FindFileData.dwFileAttributes=48) then
if FindFileData.dwFileAttributes and faDirectory = faDirectory then
begin
folderSum:=folderSum+1;
FileTestForm.ListBox1.Items.Add(tfile+'-->'+IntToStr(FindFileData.dwFileAttributes));
if sDirName[Length(sDirName)]<>'\' then
GetFolserSizeDone(sDirName+'\'+tfile,sTime,SizeTotalTrue,SizeTotal,fileSumTrue, fileSum, folderSum)
else
GetFolserSizeDone(sDirName+tfile,sTime,SizeTotalTrue,SizeTotal,fileSumTrue, fileSum, folderSum);
end
else
begin
if GetFileLastModifyTime(sDirName+'\'+tfile)>timeAfter then
begin
fileSumTrue:=fileSumTrue+1;
fileSum:=fileSum+1;
dirSizeTotal:=dirSizeTotal+GetFileSize(sDirName+'\'+tfile);
dirSizeTotalAll:= dirSizeTotalAll+ GetFileSize(sDirName+'\'+tfile);
getStr:=intToStr(FindFileData.dwFileAttributes)+','+DateTimeToStr(now)+','+tfile+' 的大小为:'+FormatFloat('#,##0.00',GetFileSize(sDirName+'\'+tfile))+'KB';
FileTestForm.ListBox1.Items.Add(getStr);
end
else
begin
fileSum:=fileSum+1;
dirSizeTotalAll:= dirSizeTotalAll+ GetFileSize(sDirName+'\'+tfile);
getStr:=intToStr(FindFileData.dwFileAttributes)+','+'***'+DateTimeToStr(now)+','+tfile+' 的大小为:'+FormatFloat('#,##0.00',GetFileSize(sDirName+'\'+tfile))+'KB';
FileTestForm.ListBox1.Items.Add(getStr);
end
end;
until FindNextFile(hFindFile,FindFileData)=false;
Windows.FindClose(hFindFile);
end
else
begin
ChDir(sCurDir);
//FileTestForm.ListBox1.Items.Add('error');
exit;
end;
//回到原来的目录下
ChDir(sCurDir);
end;
procedure TFolderSizeThread.GetFolserSize;
begin
GetFolserSizeDone(sFolderName,timeAfter,dirSizeTotal,dirSizeTotalAll,fileNumberTrue,fileNumber,DirNumber);
FileTestForm.ListBox1.Items.Add('==========共有文件夹:'+IntToStr(DirNumber)+'个');
FileTestForm.ListBox1.Items.Add('==========符合条件的文件共有:'+IntToStr(fileNumberTrue)+'个');
FileTestForm.ListBox1.Items.Add('==========符合条件的文件总大小为:'+FormatFloat('#,##0.00',dirSizeTotal)+'KB');
FileTestForm.ListBox1.Items.Add('==========共有文件:'+IntToStr(fileNumber)+'个');
FileTestForm.ListBox1.Items.Add('==========实际总大小为:'+FormatFloat('#,##0.00',dirSizeTotalAll)+'KB');
end;
procedure TFolderSizeThread.Execute;
begin
{ Place thread code here }
FreeOnTerminate:=True;
synchronize(GetFolserSize);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -