模擬實現 tree 指令

2021-08-15 07:51:10 字數 2798 閱讀 5719

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