UNIX程式設計實驗三 目錄樹的遍歷

2021-06-07 03:10:02 字數 4359 閱讀 3213

實驗三 目錄樹的遍歷

一、目的

掌握與檔案和目錄樹有關的系統呼叫和庫函式。

二、要求

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...