線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2602
推到 Plurk!
推到 Facebook!

列出某目錄底下所有子目錄及檔案是用findfirst,findnext及遞回呼叫,請問能不用遞回呼叫來完成嗎?

答題得分者是:jow
vbkiller
一般會員


發表:65
回覆:28
積分:18
註冊:2007-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-11-26 16:23:03 IP:125.224.xxx.xxx 未訂閱
列出某目錄底下所有子目錄及檔案常常是用findfirst,findnext及遞回呼叫來完成,請問能不用遞回呼叫來完成嗎?因為我比較看不懂遞回呼叫,及遞回呼叫後程式流程到那裡.
編輯記錄
vbkiller 重新編輯於 2009-11-26 16:37:28, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-11-27 23:56:53 IP:211.72.xxx.xxx 訂閱
若不用遞回呼叫, 子目錄有0至n層, 您要如何控制?
當然您也可以寫成 SubFunction 的方式, 傳參數並控制父子目錄的關系, 但不會比較簡易.

遞回呼叫一定有一個條件式判斷要結束遞回, 然後回到呼叫此遞回的 Statement 的下一 Statement.
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-11-30 08:44:54 IP:59.125.xxx.xxx 訂閱
覺得很怪,就是遞迴比較簡單,所以才用遞迴?
你與常人不同喔 ~
當然,可以不用遞迴,但是複雜度是超過線性關係的成長喔!你要考慮掌握得來嗎?

同時,如果你連遞迴都看不懂,非遞迴的,我想,你可以不用想了,鐵定看不懂

先把遞迴學好,是比較快解決你問題的方式

===================引 用 vbkiller 文 章===================
列出某目錄底下所有子目錄及檔案常常是用findfirst,findnext及遞回呼叫來完成,請問能不用遞回呼叫來完成嗎?因為我比較看不懂遞回呼叫,及遞回呼叫後程式流程到那裡.
vbkiller
一般會員


發表:65
回覆:28
積分:18
註冊:2007-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-12-05 16:45:34 IP:218.164.xxx.xxx 未訂閱
syntax大你好:

大概5,6年前,我曾藉由呼叫windows unit之Reg api以列示出 HKEY_LOCAL_MACHINE之下之子機碼及非子機碼之資料(字串或二進位或dword或多字串或可擴充字串),結果成功列示出來,我覺得機碼之架構很類似子目錄及檔案,故才會提出這問題,所以我認為應該可用我以前寫法 列示子目錄及檔案,但我認為在檔案目錄方面較難做到是api回傳資料之問題,因為在Reg api有一api可回傳子機碼數及非子機碼數,但findfirst
似乎無法做到這樣,故就像syntax大說得,真得很難不用遞迴呼叫以達成列示子目錄及檔案.

ps:列示 HKEY_LOCAL_MACHINE之下之子機碼及非子機碼之資料是想要知道安裝程式後被新增什麼子機碼及非子機碼之資料

===================引 用 syntax 文 章===================
覺得很怪,就是遞迴比較簡單,所以才用遞迴?
你與常人不同喔 ~
當然,可以不用遞迴,但是複雜度是超過線性關係的成長喔!你要考慮掌握得來嗎?

同時,如果你連遞迴都看不懂,非遞迴的,我想,你可以不用想了,鐵定看不懂

先把遞迴學好,是比較快解決你問題的方式

===================引 用 vbkiller 文 章===================
列出某目錄底下所有子目錄及檔案常常是用findfirst,findnext及遞回呼叫來完成,請問能不用遞回呼叫來完成嗎?因為我比較看不懂遞回呼叫,及遞回呼叫後程式流程到那裡.
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-12-07 08:13:34 IP:59.125.xxx.xxx 訂閱
嗯,不知道你有沒有追蹤過那個 API,或許該 API 內幫你用遞迴完成工作了

不過 Reg 是一種資料庫,我想用索引來處理的機會比較高吧!

遞迴比較接近人類思考方式,所以比較好用,但缺點是,速度不是最快,同時還要確認,堆疊夠用

===================引 用 vbkiller 文 章===================
syntax大你好:

大概5,6年前,我曾藉由呼叫windows unit之Reg api以列示出 HKEY_LOCAL_MACHINE之下之子機碼及非子機碼之資料(字串或二進位或dword或多字串或可擴充字串),結果成功列示出來,我覺得機碼之架構很類似子目錄及檔案,故才會提出這問題,所以我認為應該可用我以前寫法 列示子目錄及檔案,但我認為在檔案目錄方面較難做到是api回傳資料之問題,因為在Reg api有一api可回傳子機碼數及非子機碼數,但findfirst
似乎無法做到這樣,故就像syntax大說得,真得很難不用遞迴呼叫以達成列示子目錄及檔案.

ps:列示 HKEY_LOCAL_MACHINE之下之子機碼及非子機碼之資料是想要知道安裝程式後被新增什麼子機碼及非子機碼之資料

===================引 用 syntax 文 章===================
覺得很怪,就是遞迴比較簡單,所以才用遞迴?
你與常人不同喔 ~
當然,可以不用遞迴,但是複雜度是超過線性關係的成長喔!你要考慮掌握得來嗎?

同時,如果你連遞迴都看不懂,非遞迴的,我想,你可以不用想了,鐵定看不懂

先把遞迴學好,是比較快解決你問題的方式

===================引 用 vbkiller 文 章===================
列出某目錄底下所有子目錄及檔案常常是用findfirst,findnext及遞回呼叫來完成,請問能不用遞回呼叫來完成嗎?因為我比較看不懂遞回呼叫,及遞回呼叫後程式流程到那裡.
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-12-07 09:44:13 IP:211.74.xxx.xxx 未訂閱


[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
procedure GetFileList(Dir: string; L: TStringList);
var
S: string;
F: TSearchRec;
DirList: TStringList;
begin
if L = nil then EXIT;
DirList := TStringList.Create;
try
DirList.Add(Dir);
while DirList.Count > 0 do
begin
Dir := DirList[0];
DirList.Delete(0);
if FindFirst(Dir '\*.*',faAnyFile,F) = 0 then
repeat
if (F.Name <> '.') and (F.Name <> '..') then
begin
S := Dir '\' F.Name;
if F.Attr and faDirectory = faDirectory
then DirList.Insert(0,S)
else L.Add(S);
end;
until FindNext(F) <> 0;
FindClose(F);
end;
finally
FreeAndNil(DirList);
end;
end;
var
t: Cardinal;
L: TStringList;
begin
L := TStringList.Create;
try
t := GetTickCount;
try
GetFileList('C:\TEMP',L);
finally
ShowMessage(IntToStr(GetTickCount-t));
end;
ListBox1.Items.Text := L.Text;
finally
FreeAndNil(L);
end;
end;
[/code]



[code delphi]
procedure TForm1.Button2Click(Sender: TObject);
procedure GetFileList(Dir: string; L: TStringList);
var
S: string;
F: TSearchRec;
begin
if L = nil then EXIT;
if FindFirst(Dir '\*.*',faAnyFile,F) = 0 then
repeat
if (F.Name <> '.') and (F.Name <> '..') then
begin
S := Dir '\' F.Name;
if F.Attr and faDirectory = faDirectory
then GetFileList(S,L)
else L.Add(S);
end;
until FindNext(F) <> 0;
FindClose(F);
end;
var
t: Cardinal;
L: TStringList;
begin
L := TStringList.Create;
try
t := GetTickCount;
try
GetFileList('C:\TEMP',L);
finally
ShowMessage(IntToStr(GetTickCount-t));
end;
ListBox1.Items.Text := L.Text;
finally
FreeAndNil(L);
end;
end;
[/code]


謹供參考...
===================引 用 vbkiller 文 章===================
列出某目錄底下所有子目錄及檔案常常是用findfirst,findnext及遞回呼叫來完成,請問能不用遞回呼叫來完成嗎?因為我比較看不懂遞回呼叫,及遞回呼叫後程式流程到那裡.
系統時間:2024-04-26 14:16:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!