Delphi編寫一個文件數量管理的小程序,主要使用BitBtn 控件、Edit 控件、Panel 控件、DriveComboBox 和DirectoryListBox 等控件來實現。Delphi 6.0 中帶有強大的文件管理功能,主要的文件類型控件包括DriveComboBox、DirectoryListBox、FilterComboBox 和FileListBox 四種控件,這四種控件常常綜合使用,通過調用文件處理的函數,可以對文件和目錄進行各種操作。這四個控件的作用如下:DriveComboBox 控件的作用是顯示當前計算機中全部有效的驅動器,以供用戶選擇和操作;DirectoryListBox 控件的作用是顯示當前計算機有效驅動器中當前驅動器的樹形目錄結構,以供用戶選擇和操作;FileListBox 控件的作用是顯示當前路徑中符合條件的所有文件列表;FilerListBox 控件的作用是為用戶提供從文件列表框中篩選文件的條件。但要實現統計功能,還必須和查找文件函數結合起來運用。
程序運行界面效果:
具體設計步驟:
因為程序主要解決對文件和文件夾的統計功能,這必須和查找文件函數結合起來使用,我們需要用到Tree 和File 所關聯的函數。Delphi 提供的相關函數統計出文件所占大小,是以字節為單位的,因為多數時候統計出的結果是很大的,這時用字節表示將是一個很大的數字。我們需要將其轉換為K 和M為大小的單位。這需要用IF 語句進行判斷,當文件大小大於1M 時,我們用M 做單位,當小於1M 時,只需用K 做單位即可。
1.新建工程:
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。
2.修改窗口:
(1)激活Form1 窗口,在“屬性”面板中設置該窗體的Caption 屬性為“統計文件數目和大小”,Color 屬性設置為“clSkyBlue”。
(2)選擇“標准”頁上的Panel 選項,在窗體中添加3 個Panel 控件,調整其合適的大小和位置。
(3)選擇“附加”頁上的BitBtn 選項,在窗體中添加BitBtn 控件,調整其合適的大小和位置。在“屬性”面板上設置其Caption 屬性分別為“查找”和“退出”。選中“查找”BitBtn,在“屬性”面板上Glyph 屬性右邊的文本框中點擊圖標,打開“圖畫編輯器”對話框。點擊對話框中的“加載”按鈕,從彈出的對話框中選擇合適的圖標文件,點擊“確定”按鈕確定為該BitBtn 控件添加的圖標。
(4)按照步驟(3)的操作為“退出”按鈕添加圖標。
(5)選擇Win 3.1 頁上的DirectoryListBox 選項,在窗體中一個面板上添加DirectoryListBox 控件,調整其合適的大小和位置。在“屬性”面板上設置其Color 屬性均為“clMoneyGreen”,Font.Color 屬性為“clBlue”,Align 屬性設置為“alClIEnt”,使其占據整個面板。
(6)選擇Win 3.1 頁上的DriveComboBox 選項,在窗體中添加DriveComboBox 控件,在“屬性”面板上設置其Color 屬性為“clMoneyGreen”,Font.Color 屬性為“clBlue”。
(7)選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Form 選項,新建一個窗體Form2,作為統計結果的窗體。在“屬性”面板上設置其Color 屬性為“clSkyBlue”,Caption 屬性為“統計結果”。
(8)選擇“標准”頁上的Label 選項,在窗體中添加三個Label 控件,分別調整其合適的大小和位置。在“屬性”面板上設置其Color 屬性為“clSkyBlue”,Font.Color 屬性為“clBlue”,Caption 屬性分別為“浏覽的目錄數”、“浏覽的文件數”和“文件字節大小”。
(9)選擇“標准”頁上的Edit 選項,在窗體中添加三個Edit 控件,分別調整其合適的大小和位置。在“屬性”面板上設置其Color 屬性均為“clMoneyGreen”,Font.Color屬性均為“clBlue”。Name 屬性分別為“Name1”、“Name2”和“Name3”。
(10)選擇“標准”頁上的Button 選項,在窗體中添加一個Button 控件,調整其合適的大小和位置。在“屬性”面板上設置其Caption 屬性為“返回”。
關鍵的代碼分析:
(1)雖然DriveComboBox 可以提供所要浏覽的文件所在的驅動器,可以統計任意驅動器內的文件,而DirectoryListBox 則可以提供所要浏覽的文件所在的文件夾,不過要想擁有一定的統計功能,還必須和查找文件函數結合起來運用,因此我們要定義一個函數,使得具有統計功能,函數定義如下:
procedure TForm1.MakeTree; var Sr : TSearchRec; Err : integer; TrSize, FilePath : string; Begin Err:=FindFirst(’*.*’,$37,Sr) ; //查找符合條件的第一個文件 While (Err = 0) do begin if Sr.Name[1]<>’.’ then begin FilePath:=ExpandFileName(Sr.Name); //設置查找文件路徑 TreeSize:=TreeSize+Sr.Size; TrSize:=FloatToStr(TreeSize); //將Float 類型轉換成Str 類型 Form1.Caption:=DirectoryListBox1.Directory+’ ’+IntToStr(TreeCount) +’ files and folders Size: ’+TrSize; //改變窗體名,動態顯示查詢過程 if (Sr.Attr and faDirectory)=0 then //文件查找結束時 begin FilesSize:=FilesSize+Sr.Size; //統計文件所占磁盤空間大小 inc(FilesCount); end; inc(TreeCount); end; If ((Sr.Attr and faDirectory)<>0)AND(Sr.Name[1] <> ’.’) then //文件沒有查找結束時 begin DirsSize:=DirsSize+Sr.Size; inc(DirsCount); ChDir(Sr.Name) ; MakeTree ; //以樹形顯示文件路徑,繼續查找和統計 ChDir(’..’) ; end ; Err:=FindNext(Sr) ; end; end;
(2)當點擊“查找”按鈕時,先要設置各個控件的初始狀態,然後調用相關函數進行查找和統計。統計完畢,顯示統計結果窗口。顯示統計結果的文件大小時,文件占用空間小於1M 與大於1M 分別進行處理。代碼如下:
procedure TForm1.BitBtn1Click(Sender: TObject); begin TreeCount:=1; //統計初始設置 FilesCount:=0; DirsCount:=0; TreeSize:=0; FilesSize:=0; DirsSize:=0; ChDir(DirectoryListBox1.Directory); //設置DirectoryListBox1 與所指定驅動器一致 MakeTree; with Form2 do begin Edit1.Text:=inttostr(DirsCount); //數據類型轉換 Edit2.Text:=inttostr(FilesCount); if filesSize<1048576.0 then //當文件總空間小於1M 時 begin FileSize1:=(FilesSize)/1024; Edit3.Text:=FormatFloat(’0’+’KB’,FileSize1); end else //當文件總空間大於1M 時 begin FileSize1:=(FilesSize)/1048576; Edit3.Text:=FormatFloat(’0’+’M’,FileSize1); end; end; Form2.show; //顯示Form2 end;
(3)退出程序的運行只需Close 語句即可實現。
procedure TForm1.BitBtn2Click(Sender: TObject); begin close; //退出程序 end;
(4)點擊統計結果窗體的返回按鈕,實現關閉統計結果窗體,返回主程序窗口的功能,代碼如下:
procedure TForm2.Button1Click(Sender: TObject); begin Form2.close; //關閉統計結果窗體,返回查詢窗口 end;
程序完整代碼:Unit1文件代碼:
001
unit
Unit1;
002
interface
003
uses
004
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
005
StdCtrls, Buttons, ExtCtrls, FileCtrl;
006
type
007
TForm1 =
class
(TForm)
008
Panel1: TPanel;
009
Panel2: TPanel;
010
BitBtn1: TBitBtn;
011
Panel3: TPanel;
012
Panel4: TPanel;
013
DriveComboBox1: TDriveComboBox;
014
Panel5: TPanel;
015
DirectoryListBox1: TDirectoryListBox;
016
BitBtn2: TBitBtn;
017
procedure
MakeTree;
018
procedure
BitBtn1Click(Sender: TObject);
019
procedure
BitBtn2Click(Sender: TObject);
020
private
021
{ Private declarations }
022
public
023
{ Public declarations }
024
end
;
025
var
026
Form1: TForm1;
027
TreeCount, FilesCount, DirsCount :
integer
;
028
TreeSize, FilesSize, DirsSize :
longint
;
029
fileSize1:
real
;
030
implementation
031
uses
Unit2;
032
{$R *.DFM}
033
procedure
TForm1
.
MakeTree;
034
var
Sr : TSearchRec;
035
Err :
integer
;
036
TrSize, FilePath :
string
;
037
Begin
038
Err:=FindFirst(’*.*’,
$37
,Sr) ;
//查找符合條件的第一個文件
039
While
(Err =
0
)
do
040
begin
041
if
Sr
.
Name[
1
]<>’.’
then
042
begin
043
FilePath:=ExpandFileName(Sr
.
Name);
//設置查找文件路徑
044
TreeSize:=TreeSize+Sr
.
Size;
045
TrSize:=FloatToStr(TreeSize);
//將Float 類型轉換成Str 類型
046
Form1
.
Caption:=DirectoryListBox1
.
Directory+’ ’+IntToStr(TreeCount)
047
+’ files
and
folders Size: ’+TrSize;
048
//改變窗體名,動態顯示查詢過程
049
if
(Sr
.
Attr
and
faDirectory)=
0
then
//文件查找結束時
050
begin
051
FilesSize:=FilesSize+Sr
.
Size;
//統計文件所占磁盤空間的大小
052
inc(FilesCount);
053
end
;
054
inc(TreeCount);
055
end
;
056
If
((Sr
.
Attr
and
faDirectory)<>
0
)
AND
(Sr
.
Name[
1
] <> ’.’)
then
057
//文件沒有查找結束時
058
begin
059
DirsSize:=DirsSize+Sr
.
Size;
060
inc(DirsCount);
061
ChDir(Sr
.
Name) ;
062
MakeTree ;
//以樹形顯示文件路徑,繼續查找和統計
063
ChDir(’..’) ;
064
end
;
065
Err:=FindNext(Sr) ;
066
end
;
067
end
;
068
procedure
TForm1
.
BitBtn1Click(Sender: TObject);
069
begin
070
TreeCount:=
1
;
//統計初始設置
071
FilesCount:=
0
;
072
DirsCount:=
0
;
073
TreeSize:=
0
;
074
FilesSize:=
0
;
075
DirsSize:=
0
;
076
ChDir(DirectoryListBox1
.
Directory);
077
//設置DirectoryListBox1 與所指定驅動器一致
078
MakeTree;
079
with
Form2
do
080
begin
081
Edit1
.
Text:=inttostr(DirsCount);
//數據類型轉換
082
Edit2
.
Text:=inttostr(FilesCount);
083
if
filesSize<
1048576.0
then
//當文件總空間小於1M 時
084
begin
085
FileSize1:=(FilesSize)/
1024
;
086
Edit3
.
Text:=FormatFloat(’
0
’+’KB’,FileSize1);
087
end
088
else
//當文件總空間大於1M 時
089
begin
090
FileSize1:=(FilesSize)/
1048576
;
091
Edit3
.
Text:=FormatFloat(’
0
’+’M’,FileSize1);
092
end
;
093
end
;
094
Form2
.
show;
//顯示Form2
095
end
;
096
procedure
TForm1
.
BitBtn2Click(Sender: TObject);
097
begin
098
close;
//退出程序
099
end
;
100
end
.
Unit2文件代碼:
vIEw source