C語言實現文件類型統計函數

#include<dirent.h>
#include<limits.h>
#include<sys/stat.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>#define FTW_F        1        //標記非目錄文件
#define FTW_D        2        //標記目錄文件
#define FTW_DNR        3        //標記不可讀目錄
#define FTW_NS        4        //標記不可獲得stat的文件static char *fullpath;        //保存文件的全路徑
static size_t pathlen;        //保存文件的路徑長度//定義處理文件的函數
typedef int Myfunc(const char *,const struct stat*,int);
static Myfunc myfunc;
static int myftw(char *,Myfunc *);
static int dopath(Myfunc *);
char *path_alloc(size_t *size_t);/*
nreg:普通文件的個數;    ndir: 目錄文件的數量;    nblk:塊特殊文件的數量
nchr:字符特殊文件的數量    nfifo:管道特殊文件的數量
nslink:符號連接特殊文件的數量;    nsock:套接字文件數量; ntot:總文件數量
*/
static long nreg,ndir,nblk,nchr,nfifo,nslink,nsock,ntot;int main( int argc, char *argv[])
{int ret;if(argc != 2){printf("falut command input !\n");exit(1);}//計算各類文件的個數ret = myftw(argv[1],myfunc);ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock;//避免除以0if(ntot == 0){ntot = 1;}printf("regular files = %7ld,%5.2f %%\n",nreg,nreg*100.0 / ntot);printf("direciotn files = %7ld,%5.2f %%\n",ndir,ndir*100.0 / ntot);printf("block special = %7ld,%5.2f %%\n",nblk,nblk*100.0 / ntot);printf("char special = %7ld,%5.2f %%\n",nchr,nchr*100.0 / ntot);printf("FIFOS  = %7ld,%5.2f %%\n",nfifo,nfifo*100.0 / ntot);printf("symbolic links = %7ld,%5.2f %%\n",nslink,nslink*100.0 / ntot);printf("sockers  = %7ld,%5.2f %%\n",nsock,nsock*100.0 / ntot);}//處理pathname并保存在一個全局的字符數組中,調用dopath
static int myftw(char *pathname,Myfunc *func)
{//為保存路徑的字符串數組分配空間fullpath = path_alloc(&pathlen);//如果分配內存空間不夠就重新分配if(pathlen <= strlen(pathname)){pathlen = strlen(pathname) * 2;if((fullpath = realloc(fullpath,pathlen )) == NULL);printf("realloc failed\n");}//將路徑名參數保存到全路徑中,fullpath是全局變量,dopath函數可以調用
    strcpy(fullpath,pathname);return (dopath(func));
}//路徑數組分配
char *path_alloc(size_t *size)
{char *p = NULL;if(!size)return NULL;p = malloc(256);if(p)*size = 256;else*size = 0;return p;
}//dopath用于判斷是否是目錄,然后根據選擇情況是直接進入myfun函數取技術
//還是遞歸調用dopath函數
static int dopath(Myfunc *func)
{struct stat        statbuf;struct dirent    *dirp;DIR             *dp;int             ret,n;//調用lstat獲取路徑名的stat信息,如果不成功,調用func函數,并傳遞給FTW_NSif(lstat(fullpath,&statbuf) < 0)return (func(fullpath, &statbuf, FTW_NS));//查看文件stat結構的st_mode,如果不是目錄,調用func函數 //并傳遞給FTW_F,交由myfun進一步判斷文件類型 if(S_ISDIR(statbuf.st_mode) == 0)return(func(fullpath,&statbuf,FTW_F));//最后一種情況就是該路徑名代表的是一個目錄,此次的fun的正常情況返回0//所以執行完func后還不會返回,會繼續執行funcif((ret = func(fullpath,&statbuf,FTW_D)) != 0)return(ret);//路徑處理,擴充路徑空間長度n = strlen(fullpath);if(n + NAME_MAX + 2 > pathlen){pathlen *= 2;if((fullpath = realloc(fullpath,pathlen)) == NULL){printf("realoc failed\n");}}fullpath[n++] = '/';fullpath[n] = 0;//處理每個目錄項if((dp = opendir(fullpath)) == NULL)return (func(fullpath,&statbuf,FTW_DNR));while((dirp = readdir(dp)) != NULL){//忽略當前目錄(.)和上一級目錄(..)以避免進入死循環if(strcmp(dirp->d_name,".") == 0 ||     strcmp(dirp->d_name,"..") == 0 )continue;strcpy(&fullpath[n],dirp->d_name); //在“/”之后加上當前目錄項的命中if((ret = dopath(func)) != 0) //然后采用新的路徑名遞遞歸的調用dopathbreak;}fullpath[n-1] = 0;//關閉目錄if(closedir(dp) < 0 )printf("can't close directory %s",fullpath);return ret;}//通過stat結構的st_mode字段來判斷文件的類型,并計數
static int myfunc(const char *pathname,const struct stat *statptr,int type)
{switch(type){//會與非目錄情況進行處理case FTW_F:switch (statptr->st_mode & S_IFMT){case S_IFREG:    nreg++;    break;case S_IFBLK:    nblk++;    break;case S_IFCHR:    nchr++;    break;case S_IFIFO:    nfifo++;    break;case S_IFLNK:     nslink++;    break;case S_IFSOCK:    nsock++;     break;case S_IFDIR:    printf("for S_IFDIR for %s",pathname);}break;//對于目錄文件進行處理case FTW_D:ndir++;break;//對于不可讀目錄進行處理case FTW_DNR:printf("%s dir isn't read",pathname);break;case FTW_NS:printf("%s stat error",pathname);default:printf("%d type aren't identified, path is %s",type,pathname);}return 0;
}

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/11608159.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384806.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言實現多線程排序

#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h>/* 聲明變量 */ int array_length, file_length; int *array_master; FILE *freader;/* 用于從文件讀取數據 */ int *read_file(char *fname) {freader fopen(fnam…

linux線程操作

初始化條件變量 int pthread_cond_init(pthread_cond_t *cv,pthread_cond_attr *cattr); 函數返回值&#xff1a;返回0表示成功&#xff0c;返回其他表示失敗。 參數&#xff1a; pthread_cond_attr是用來設置pthread_cond_t的屬性&#xff0c;當傳入的值是NULL的時候表…

Linux下多線程模擬停車場停車

#include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> #include<pthread.h>#define ONE_SECOND 1000000 #define RANGE 10 #define PERIOD 2 #define NUM_THREADS 4typedef struct {int *carpark; //用一個數組來模…

【C++學習之路】第一章——C++核心方法總論

1 C核心方法總論 1.1 核心思想 通過實際項目來學習編程&#xff0c;更高效掌握編程規則&#xff0c;以及明白各種語法規則的實際應用。 實驗思想&#xff1a;任何C的參考資料都不可能覆蓋你遇到的所有問題&#xff0c;這個時候&#xff0c;最好的辦法就是&#xff0c;編輯代…

【Verilog HDL學習之路】第一章 Verilog HDL 數字設計總論

1 Verilog HDL 數字設計總論 1.1 幾個重要的概念 EDA&#xff08;Electronic Design Automation&#xff09; 電子技術自動化 EDA工具 類似于軟件工程中的IDE&#xff08;集成開發環境&#xff09;&#xff0c;能夠使用Verilog HDL語言描述電路設計&#xff0c;并且能夠通過邏…

【學會如何學習系列】從嬰兒到大學——學習的本質從未改變過

從嬰兒到大學——學習的本質從未改變過 從我們出生一直到現在&#xff0c;其實&#xff0c;學習的本質從來都沒有改變過&#xff0c;并且&#xff0c;嬰兒時期的我們&#xff0c;是學習能力最強的時候&#xff0c;隨著我們不斷長大&#xff0c;外界的誘惑越來越多&#xff0c;…

【匯編語言學習之路】第一章 匯編語言核心方法論

版權聲明&#xff1a;本學習筆記是本人根據小甲魚“匯編語言學習課程”和《匯編語言》&#xff08;王爽&#xff09;的書籍&#xff0c;來記錄筆記的 1 匯編語言核心方法論 1.1 學習匯編語言的必要性 匯編語言與機器語言是一一對應關系&#xff0c;它的本質是機器語言的代號。…

藍橋單片機賽題及模擬題代碼

鏈接&#xff1a;https://pan.baidu.com/s/1BVB6VILEed0ufqRDMhvALg 提取碼&#xff1a;ukx7

【Verilog HDL學習之路】第二章 Verilog HDL的設計方法學——層次建模

2 Verilog HDL的設計方法學——層次建模 重要的思想&#xff1a; 在語文教學中&#xff0c;應該先掌握核心方法論&#xff0c;再用正確的方法論去做題目&#xff0c;這樣能夠逐漸加深對于方法論的理解&#xff0c;做題的速度和準確率也會越來越高。在Verilog HDL中&#xff0c…

stm32機械臂資料含視頻

這是在網上買的機械臂的資料 含視頻及相關軟件 在這里分享給大家 不過很大 但是內容很全 鏈接&#xff1a;https://pan.baidu.com/s/1Fd18ww8jxLH8ChqomstZtw 提取碼&#xff1a;147g

【Verilog HDL】第四章 模塊的端口連接規則——污水處理模型

先放上連接規則的簡圖&#xff0c;再詳細解釋 1. 構建模型——污水處理之流水模型 我們先將上述結構構件一個簡單模型&#xff0c;以幫助我們理解。 污水&#xff1a;輸入數據凈水&#xff1a;輸出數據雙向數據暫不討論&#xff0c;取輸入和輸出的交集即可污水處理廠&…

藍橋杯嵌入式第七屆模擬題 代碼

鏈接&#xff1a;https://pan.baidu.com/s/1fdGC20A51axxPGpoyRL8-w 提取碼&#xff1a;by4u

三級嵌入式選擇知識點整理

SoC芯片 通用SoC是系統級芯片 既可以是單核 也可以是多核 該芯片中可以包含數字電路 模擬電路 數字模擬混合電路 及射頻電路 片上系統可使用單個芯片進行數據的采集 轉換 儲存 處理 及I/O口功能 智能手機 和平板都使用的SOC WAV是未壓縮的數字音頻 音質與CD相當 音頻視頻壓縮…

【Verilog HDL】命名的規則研究

Verilog命名規范參考資料 1. 什么可以被命名&#xff1f; 模塊的名稱模塊實例的名稱各種數據類型的名稱 這些名稱我們稱之為標識符&#xff0c;標識符的命名規則不再強調&#xff0c;與C語言類似&#xff0c;字母、數字、下劃線&#xff08;_&#xff09;和美元符號&#xf…

【Verilog HDL】深入理解部分語法規則的本質

1. 門級描述 統一規則&#xff1a; 門類型 (輸出&#xff0c;輸入); 細化規則&#xff1a; 與/或門&#xff1a; 多入一出 門 (輸出&#xff0c;輸入1&#xff0c;輸入2,……);緩沖門/非門&#xff1a;一入多出 門 (輸出1&#xff0c;輸出2,……輸出n&#xff0c;輸入); 門…

三級嵌入式填空整理

實時 可預測性是實時系統的重要性能標準 按照響應時間 實時操作系統可分為 1.普通實時操作系統 響應時間一般是秒級 2.強實時操作系統 響應時間為毫秒和微秒級 3.弱實時操作系統 響應時間為數十秒 RTOS 響應中斷請求并完成相應中斷服務子程序的時間非常快 這個時間具有一致性…

【Verilog HDL】從邏輯電路圖到門級建模——人工翻譯的方法論

從左到右&#xff0c;從上到下 先搞定緩沖/非門&#xff0c;再寫與/或門 1. 實例解讀 先以四選一數據選擇器進行說明 對于數字邏輯的部分不再說明&#xff0c;直接進行邏輯電路圖到Verilog門級建模的人工翻譯過程的描述。 1.1 端口和線網分析 確定輸入/輸出端口 輸入端口 …

三級嵌入式 匯編指令匯總

ARM條件碼 EQ 相等 NE 不相等 CS/HS 無符號大于等于 CC/LO 無符號小于 HI 無符號大于 LS 無符號小于等于 GE 帶符號大于等于 L…

【Verilog HDL】語句的并發執行

1. 實踐得到的啟發 先從一個簡單的現象得出結論&#xff0c;Verilog語句是并發執行的&#xff01; 同時&#xff0c;這也是**$monitor系統任務為全局有效**的一個重要支持因素&#xff0c;如果沒有并發&#xff0c;它是完不成這項功能的實現的。 眾所周知&#xff0c;高級語…

linux下 最常用基本命令

常用命令 基本命令 pwd 打印絕對路徑 ls 路徑 列舉文件名 ls 列舉文件的權限 屬于哪個用戶 容量大小 修改…