【摘 要】在VF6.0中有文件復(fù)制命令“copy file…”,但我們常需要將某個目錄及其下的所有文件(夾)全部復(fù)制到指定目錄下,本文探討了如何用遞歸算法實現(xiàn)這一目錄結(jié)構(gòu)的復(fù)制方法。
【關(guān)鍵詞】VF6.0遞歸復(fù)制
【中圖分類號】TP311.5【文獻標識碼】A【文章編號】1006-9682(2009)10-0153-01
一、問題提出
在VF6.0中,可以利用“copy file filename1 to filename2”命令實現(xiàn)將文件filename1復(fù)制到filename2中,其中文件名都帶路徑,同時文件名中也可帶通配符,實現(xiàn)多個文件的復(fù)制。但在實際應(yīng)用中,我們常需要將一個目錄下的所有文件及子目錄一并復(fù)制到指定目錄中,比如筆者在做一個“計算機題庫”中包含操作練習,為了用戶能正常練習操作部分,每次生成模擬試題時都要重新將系統(tǒng)中操作所需的源目錄(包括其下的整個目錄結(jié)構(gòu))復(fù)制到一指定目錄中,那如何實現(xiàn)對整個目錄結(jié)構(gòu)的復(fù)制?
二、解決思路
讓系統(tǒng)自動完成目錄結(jié)構(gòu)復(fù)制不可避免地要用到遞歸的思想,具體的思路是:首先獲得要復(fù)制的源目錄中的文件及子目錄總數(shù)與名稱,然后用一個循環(huán)依次判斷是這個名稱代表的是文件還是目錄,如果是文件則復(fù)制該文件到目標目錄中;如果是子目錄,則在目標目錄中建立該子目錄,并進入源目錄的這個子目錄,重復(fù)這個過程,實現(xiàn)一個遞歸調(diào)用,直至搜索完整個目錄結(jié)構(gòu)。
三、分 析
要實現(xiàn)文件的復(fù)制,首先要建立目標目錄,可用MD(“目錄名”)實現(xiàn);然后需要判斷源目錄中所有的文件與子目錄的信息,并在目標目錄中建立相應(yīng)的子目錄,同時將文件用COPY FILE...命令將文件復(fù)制到目標目錄中去。MD命令與COPY FILE...命令較簡單,這里主要說明獲得目錄中文件及子目錄信息的函數(shù)ADIR(…)。
ADIR(…)函數(shù)的功能是返回指定目錄中文件(夾)的總數(shù),并將文件及子目錄的有關(guān)信息保存到某個數(shù)組中,具體格式如下:
ADIR(ArrayName
[, cFileSkeleton [, cAttribute]])
說明:
1.ArrayName是用來保存測試目錄中文件(夾)信息的數(shù)組,不用事先定義該數(shù)組,ADIR函數(shù)自動建立該數(shù)組,我們要用到其中的以下幾個元素:ArrayName(i,1)保存文件或目錄名,arrayName(i,5)反映文件或目錄的屬性,如是子目錄,其值為“...D”。
2.cFileSkeleton:指定要測試的目錄及其中的文件名的形式,若省略則指當前目錄下的所有文件。
3.cAttribute:指定是否包括測試目錄中的子目錄(D)、系統(tǒng)文件(S)及隱藏文件(H)。
舉例說明:測試C:\\yxw目錄下所有文件與子目錄數(shù)gs,并將文件(夾)名稱等信息保存到wj數(shù)組中。
gs=ADIR(wj,’c:\\yxw\\*.*’,’D’)。
注:如最后一個參數(shù)不是’D’,則返回的數(shù)目中不包括子目錄數(shù),在wj數(shù)組中也沒有相關(guān)的子目錄名等的信息。
運行結(jié)果:gs=8
wj(1,1)=“.”,...,wj(1,5)=“...D”
wj(i,2)=“..” ,...,wj(2,5)=“...D”
wj(3,1)=“File1”,...,wj(3,5)=“A”
wj(7,1)=“Aa1”,...,wj(7,5)=“...D”(表示是子目錄)
四、具體實現(xiàn)
程序名為myxcopy.prg,帶兩個參數(shù):s_directory、d_directory,分別表示要復(fù)制的源目錄與目標目錄。
先用MD命令創(chuàng)建d_directory,然后用ADIR()函數(shù)獲得S_Directory目錄中的文件及子目錄的信息:
wjs=adir(wj,“s_direct.\\*.*”,“D”)
最后用一個循環(huán)對數(shù)組wj中保存的信息進行文件或目錄的判斷(如在wj(i,5)中包含“D”,則是子目錄):是文件,則復(fù)制,若是子目錄,則先在目標目錄中建立該子目錄,然后再次調(diào)用myxcopy程序,參數(shù)變?yōu)?源目錄中該子目錄的絕對路徑和目標目錄中的該子目錄的絕對路徑:
for i=3 to wjs數(shù)組的前兩個元素是“.”、“..”的信息,應(yīng)跳過
if !(“D”$wj(i,5)) 如果不是子目錄,則復(fù)制
wjm=wj(i,1) 文件名
wait wind“正在復(fù)制s_direct.\\wjm.到d_direct”nowait
copy file ’s_direct.\\wjm’ to’ d_direct.\\wjm’
else 是目錄,則先創(chuàng)建,再遞歸調(diào)用
mlm=wj(i,1)子目錄名,注意參數(shù)的變化
do myxcopy with“s_direct.\\mlm”,“d_direct.\\mlm”
endi
endf
如將C:\\yxw復(fù)制到d:\\yb中,則可執(zhí)行程序:DO MYXCOPY WITH “C:\\YXW”,“D:\\YB”
五、總 結(jié)
利用遞歸算法,實現(xiàn)了類似復(fù)制整個目錄結(jié)構(gòu)的DOS命令XCOPY,實現(xiàn)過程簡單。同樣地,遞歸還可作許多的其它應(yīng)用,例如,可實現(xiàn)類似刪除目錄結(jié)構(gòu)的DOS命令DELETREE。