原文:
用c語言實現統計乙個資料夾中各種檔案的比例
今天做《unix環境高階程式設計》的課後題,看到題目4.11這裡提供了一種新的實現這個程式的思路,那就是每回讀到乙個目錄,就通過chdir函式進入到這個目錄,然後再通過opendir函式和readdir函式來讀取這個目錄中的檔案,然後乙個乙個分析,如果是目錄,則進行遞迴呼叫。如果不是目錄,則對這個檔案進行計數後立刻返回!這樣乙個乙個分析完目錄中的所有檔案之後再來進行乙個chdir(".."),返回到上一級的目錄。具體的實現**如下:
1 #include2 #include我這個**並不是我自己合上書寫的,而是在w.richard stevens書中給出的**的基礎上改的!在此要特別感謝這些真正的大神給我們提供了這麼優秀的書籍!這是這個程式的執行結果,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 }
那個第一行是我特意設定的,那個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目標...