實驗三 目錄樹的遍歷
一、目的
掌握與檔案和目錄樹有關的系統呼叫和庫函式。
二、要求
1、編寫程式myfind
命令語法:myfind [-comp | -name …]
命令語義:
(1)myfind 的功能:
除了具有與程式4-7相同的功能外,還要輸出在目錄子樹之下,檔案長度不大於4096位元組的常規檔案,在所有允許訪問的普通檔案中所佔的百分比。程式不允許列印出何路徑名。
(2)myfind -comp 的功能:
是常規檔案的路徑名(非目錄名,但是其路徑可以包含目錄)。命令僅僅輸出在目錄子樹之下,所有與檔案內容一致的檔案的絕對路徑名。不允許輸出任何其它的路徑名,包括不可訪問的路徑名。
(3)myfind -name …的功能:
…是乙個以空格分隔的檔名序列(不帶路徑)。命令輸出在目錄子樹之下,所有與…序列中檔名相同的檔案的絕對路徑名。不允許輸出不可訪問的或無關的路徑名。 和均既可以是絕對路徑名,也可以是相對路徑名。既可以是目錄,也可以是檔案,此時,目錄為當前工作目錄。
2、注意盡可能地提高程式的效率。注意避免因開啟太多檔案而產生的錯誤。
3、遍歷目錄樹時,訪問結點(目錄項)的具體操作應當由遍歷函式dopath攜帶的函式指標引數決定。這樣程式的結構清晰,可擴充性好。
三、設計和實現的主要原理、構思、演算法
#include"apue.h"
#include
#include
#include
#include
#include
#include
char*path_alloc(int * size)//定義path_alloc()這個函式,path_alloc
函式主要是為路徑(完整路徑)分配記憶體空間
typedefint myfunc(const char*,const struct stat *,int);//宣告了乙個新的函式型別myfunc,這種函式型別帶3個引數,返回值是int型別的
staticmyfunc myfunc1,myfunc2,myfunc3;//宣告了三個物件
staticint myftw(char *,myfunc *);//宣告函式
myftw
的原形,其引數兩個,其一為一指標,其二為一函式名
staticint dopath(myfunc *);//dopath
函式,主要是通過遞迴獲取路徑,並判斷是目錄還是檔案,從而轉向myfunc函式進一步判斷並計數
staticlong nreg,ndir,nblk,nchr,nfifo,nslink,nsock,ntot,size,dsize,count;//全域性變數,ntot是表示檔案的總數
staticchar *dbuf,*filename;
intmain(intargc,char *argv)//主函式
else if(argc>=4)
if(strcmp(argv[2],"-name")==0)}}
exit(ret);
}#defineftw_f 1
#defineftw_d 2
#defineftw_dnr 3
#defineftw_ns 4
staticchar *fullpath;
staticint
myftw(char*pathname,myfunc *func)
staticint
dopath(myfunc*func)
ptr[-1]=0;//等同 *[ptr-1]=0;
if(closedir(dp)<0)
err_ret("cant close directory%s",fullpath);
return(ret);
}staticint
myfunc1(constchar *pathname,const struct stat *statptr,int type)
break;
case ftw_d:
ndir++;
break;
case ftw_dnr: break;
case ftw_ns: break;
}return(0);
}staticint
myfunc2(constchar *pathname,const struct stat *statptr,int type)
else
}close(fd);}}
return(0);
}staticint
myfunc3(constchar *pathname,const struct stat *statptr,int type)
else}}
return(0);
}四、實驗執行及結果
源程式名:myfind.c
可執行檔案:myfind
編譯方法:gcc myfind.c error2e.c –o myfind
結束方法:ctrl+c
執行過程:
1.編譯
2.實現第乙個功能:
其中在/home/gu12/gu123104/expmt/3檔案目錄中總共存在六個檔案,其中乙個目錄檔案(.開頭的隱藏檔案),另有乙個小於4096位元組的檔案(error2e.c).
3.實現第二個功能:判定檔名相同且檔案內容一樣
當我們對其中/home/gu12/gu123104/expmt/3目錄中的apue.h做一下修改,再去實現,則情況如下:
也就找不到內容一樣的apue.h檔案了,只有本身。
4.實現第三個功能:
1)通過絕對路徑實現:
儘管我們剛把apue.h做過了修改,但還是把目錄下所有的apue.h檔案都輸出了,因為他只需要找到相同的名字。
2)通過相對路徑實現:
在相對路徑下也能實現。
① 總結
a.length=lseek(fd2,0,seek_end);
用於確定檔案的長度
b.原型宣告:
externchar *strcpy(char *dest,const char *src);
標頭檔案:
string.h
功能:把從
src位址開始且含有
null
結束符的字串賦值到以
dest
開始的位址空間
說明:src和
dest
所指記憶體區域不可以重疊且
dest
必須有足夠的空間來容納
src的字串。
返回指向
dest
的指標。
c.語法
:struct dirent* readdir(dir* dir_handle);
返回值: dirent
的結構型別
函式種類
: 檔案訪問
內容說明
本函式用來讀取目錄。返回是
dirent
結構體指標,
dirent
結構體成員如下,
struct dirent
遍歷整個目錄樹的檔案和目錄
在開發中我們常常需要遍歷整個目錄樹,這是我們寫乙個這樣的工具類,以後就方便多了,這個類中可以通過使用local 方法產生由本地目錄中的檔案構成的file物件陣列,或者通過使用walk 方法產生給定目錄下的由整個目錄樹中所有檔案構成的list.例子 輔助列印的工具類 public class ppri...
shell程式設計 遍歷目錄下的檔案
假定目錄text下有如下檔案 目錄 dir 1 dir 2 dir 3 檔案 text 1 text 2 遍歷目錄下所有的檔案是目錄還是檔案 if if型別 bin sh for file in do if test f file then echo file 是檔案 fiif test d fil...
shell程式設計 遍歷目錄下的檔案
假定目錄text下有如下檔案 目錄 dir 1 dir 2 dir 3 檔案 text 1 text 2 遍歷目錄下所有的檔案是目錄還是檔案 if if型別 bin sh forfilein.do iftest f file then echo file 是檔案 fi iftest d file t...