linux下的 tree 指令:
列印所有檔案和目錄,預設不列印隱藏檔案
在這裡,我只實現預設方式,並且檔案只區分出需要進行遍歷的目錄檔案,其他檔案統一直接進行輸出。
要實現這個指令
首先要清楚 linux 下的檔案系統,以及如何對目錄檔案進行讀取。
檔案表結構:
首先 我們要對輸入的檔案進行判斷,判斷其是否是目錄檔案。
如果輸入的檔案是普通檔案,則直接輸出,如果是目錄檔案則開始進行遍歷。
讀取檔案屬性
extern
int lstat (const
char* filename, struct stat* buf);
lstat 相比較於 stat,它不跟隨符號鏈結,同樣是將讀取到的資訊放在 buf 中。
在對首次輸入的檔案的型別進行判斷:
如果是普通檔案則直接輸出這個檔名即可。
如果是目錄檔案,則對這個目錄檔案的內容進行遍歷。
此時需要用到函式
dir* opendir(const
char* dirname);
// 開啟乙個目錄檔案,並將資訊儲存在返回的 dir 型別中。
// 物件 dir 對使用者層是透明的,可不用關注其實現細節。
int closedir(dir *dirp);
// 關閉鎖開啟的目錄流
當走到開啟目錄流時的這一步時,已經可以判定這個檔案是目錄檔案了,此時便可以對其內容進行遍歷讀取,此時需要函式
struct dirent *readdir(dir* dirp);
// 讀取目錄內容
// 每一次呼叫 readdir(),其將返回指向下乙個目錄條目的指標。
// 如果達到目錄結尾或檢測無效操作,將返回 null 指標。
而其中的 dirent 的結構為
struct dirent;
在這裡,我們使用乙個佇列來儲存所有的檔案資訊。
整體上是碰到乙個目錄檔案,則進行遞迴遍歷,並將每個檔案新增到佇列尾部。
因為提前設定了 level(層數),所以在輸出的時候是按順序,從第一層檔案的第乙個到最後乙個的所有資訊依次輸出。這樣就和 tree 指令大致較為類似了。
佇列結構:
typedef
struct nodefilenode;
typedef
struct headheadnode;
實現:
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef
struct nodefilenode;
typedef
struct headheadnode;
void print(filenode * cur) //輸出每個檔案
if( i == 0)
printf("--- ");
else
printf("|-- ");
printf("%-4s\n",cur->name);
}void free(filenode * cur) //釋放
void print_dir(headnode * link_stack) // 輸出
}void read_dir_link(char* dirname, headnode *link_stack ,int level) //對目錄檔案進行讀取
else
return;
}// 是目錄檔案
dir *dirp = opendir(dirname); // 開啟目錄流
if(dirp == null)
perror("opendir"),exit(1);
struct dirent *dp;
while((dp = readdir(dirp)) != null) // 讀取目錄檔案資訊
else
struct stat stat_src;
lstat(link->fullname, &stat_src);
if(s_isdir(stat_src.st_mode))
}closedir(dirp); // 關閉目錄流
}void read_dir(char *dirname, headnode* link_stack, int level)
void str(char *dirname, int len) // 對第乙個輸入檔案的進行格式輸出
next++;
}printf("%s\n", cur);
free(dst);
}int main(int argc, char*argv )
}
測試:
當然還不夠完善,沒有對符號鏈結檔案進行追蹤,以及高亮輸出。
模擬實現Spring IOC
通過在類上標註 registration 註冊進容器,injection從容器注入物件 容器類 public class springcontainer else bean.setbeanclass c mappropsmap new hashmap 處理注入屬性 field props c.get...
模擬實現strcmp
函式簡介 原型 int strcmp const char s1,const char s2 所在標頭檔案 string.h 功能 比較字串s1和s2。一般形式 strcmp 字串1,字串2 說明 當s1注意不是 1 當s1 s2時,返回值 0 當s1 s2時,返回正數 注意不是1 如下 int m...
模擬實現strncat
模擬實現strncat 在系統庫函式中,存在strncat這個函式,它用於字串的追加,就是在乙個字串後面再追加乙個字串,它的函式原型為 char strncat char strdest,const char strsource,size t count 在其中,strdest為目標字串,strso...