用C語言實現統計乙個資料夾中各種檔案的比例

2021-09-06 20:10:44 字數 3854 閱讀 6503

原文:

用c語言實現統計乙個資料夾中各種檔案的比例

今天做《unix環境高階程式設計》的課後題,看到題目4.11這裡提供了一種新的實現這個程式的思路,那就是每回讀到乙個目錄,就通過chdir函式進入到這個目錄,然後再通過opendir函式和readdir函式來讀取這個目錄中的檔案,然後乙個乙個分析,如果是目錄,則進行遞迴呼叫。如果不是目錄,則對這個檔案進行計數後立刻返回!這樣乙個乙個分析完目錄中的所有檔案之後再來進行乙個chdir(".."),返回到上一級的目錄。具體的實現**如下:

1 #include2 #include

3 #include4 #include5 #include6 #include7 #include8 #include9 #include10

11//

所有函式的宣告

12 typedef int myfunc(const

char *,const

struct stat*,int

);13

static myfunc myfunc; //

定義處理檔案的函式

14static

int myftw(const

char *,myfunc *);

15static

int dopath(myfunc *);

1617

//定義的全域性變數

18static

char *fullpath; //

存放檔案的名稱的變數

19static

long sock_c,lnk_c,reg_c,blk_c,dir_c,chr_c,fifo_c,total_c; //

統計各種檔案型別的數量

2021

//myfunc函式中需要定義的巨集

22#define ftw_f 1 //

檔案型別是檔案

23#define ftw_d 2 //

檔案型別是目錄

24#define ftw_ns 3 //

乙個檔案不能stat

25#define ftw_nd 4 //

乙個目錄不能被讀

26int main(int argc,char *argv)

2733 myftw(argv[1

],myfunc);

34 total_c = sock_c+lnk_c+reg_c+blk_c+dir_c+chr_c+fifo_c;

35if(0 ==total_c)

3639 printf("

socket files = %7ld, %5.2f%%\n

",sock_c,sock_c*100.0/total_c);

40 printf("

link files = %7ld, %5.2f%%\n

",lnk_c,lnk_c*100.0/total_c);

41 printf("

regular files = %7ld, %5.2f%%\n

",reg_c,reg_c*100.0/total_c);

42 printf("

block files = %7ld, %5.2f%%\n

",blk_c,blk_c*100.0/total_c);

43 printf("

directory files = %7ld, %5.2f%%\n

",dir_c,dir_c*100.0/total_c);

44 printf("

character files = %7ld, %5.2f%%\n

",chr_c,chr_c*100.0/total_c);

45 printf("

fifo files = %7ld, %5.2f%%\n

",fifo_c,fifo_c*100.0/total_c);

46 printf("

total files = %7ld, %5.2f%%\n

",total_c,total_c*100.0/total_c);

4748

return0;

49}50static

int myftw(const

char* pathname,myfunc *pmyfunc)

5161

static

int dopath(myfunc *pmyfunc)

6274

if(s_isdir(statbuf.st_mode) != 1)75

7980

//使目錄檔案++

81if(0 != (ret=pmyfunc(fullpath,&statbuf,ftw_d)))

82return

ret;

8384

//如果是目錄檔案則進入這個目錄

85if(-1 ==chdir(fullpath))

8691

92//

開啟當前目錄

93if(null == (dp=opendir("."

)))94

98while(null != (dirp=readdir(dp)))

99109 chdir("

.."); //

將當前目錄設定為上一級目錄

110//

對關閉檔案進行判斷

111if(-1 ==closedir(dp))

112115

116return

ret;

117}

118static

int myfunc(const

char * pathname,const

struct stat * statptr,int

type)

119135

break

;136

case

ftw_d:

137 dir_c++; break

;138

case

ftw_nd:

139 printf("

不能開啟目錄%s\nerror:%s\n

",pathname,strerror(errno));

140break

;141

case

ftw_ns:

142 printf("

不能開啟檔案%s\nerror:%s\n

",pathname,strerror(errno));

143break

;144

}145

return0;

146 }

我這個**並不是我自己合上書寫的,而是在w.richard stevens書中給出的**的基礎上改的!在此要特別感謝這些真正的大神給我們提供了這麼優秀的書籍!這是這個程式的執行結果,

那個第一行是我特意設定的,那個root是乙個資料夾的名字,是屬於root使用者的,所以我這裡並不能讀取,會報出乙個錯誤!下面是這個改進後的程式和原來書中的程式的乙個對比,發現效率還真的是提高不少啊!

那個descend_hierarchy_p的那個程式是書上給的程式,每回讀取都是讀取的絕對路徑的名稱!而那個descend_hierarchy_ch命令就是每回碰到乙個目錄就進入到那個資料夾中,然後再來讀取,這樣每回讀取的時候讀取的就是相對路徑的名稱了!

C語言實現遞迴刪除資料夾

使用rmdir函式只能刪除空資料夾,對於非空資料夾就無能為力了,這裡給出乙個實現,用來刪除整個資料夾 0 儲存當前絕對路徑 1 開啟要刪除的資料夾 2 進入要刪除的資料夾 3 讀資料夾 4 如果讀到的是資料夾,將當前讀到的資料夾名稱作為引數返回0遞迴 5 如果不為資料夾呼叫remove刪除 6 返回...

C 語言實現建立,刪除和移動資料夾

本文採用c 語言實現建立,刪除和移動資料夾,如下 使用directory類和directoryinfo類 一 建立資料夾 tryelse catch exception ee 二 刪除資料夾 tryelse catch exception ee 三 移動資料夾 源資料夾和目標資料夾要求存在於同乙個硬...

C 實現複製資料夾中檔案到另乙個資料夾的方法

private void copydir string srcpath,string aimpath 判斷目標目錄是否存在如果不存在則新建 if system.io.directory.exists aimpath 得到源目錄的檔案列表,該裡面是包含檔案以及目錄路徑的乙個陣列 如果你指向copy目標...