#include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <unistd.h> /* DIR *opendir(const char *pathname),即打開文件目錄,返回的就是指向DIR結構體的指針 struct __dirstream { void *__fd; char *__data; 實施 int __entry_data; char *__ptr; int __entry_ptr; size_t __allocation; size_t __size; __libc_lock_define (, __lock) }; typedef struct __dirstream DIR; int stat(const char *file_name, struct stat *buf); 的作用就是獲取文件名為d_name的文件的詳細信息,存儲在stat結構體中。以下為stat結構體的定義: struct stat { mode_t st_mode; //文件訪問權限 ino_t st_ino; //索引節點號 dev_t st_dev; //文件使用的設備號 dev_t st_rdev; //設備文件的設備號 nlink_t st_nlink; //文件的硬連接數 uid_t st_uid; //所有者用戶識別號 gid_t st_gid; //組識別號 off_t st_size; //以字節為單位的文件容量 time_t st_atime; //最后一次訪問該文件的時間 time_t st_mtime; //最后一次修改該文件的時間 time_t st_ctime; //最后一次改變該文件狀態的時間 blksize_t st_blksize; //包含該文件的磁盤塊的大小 blkcnt_t st_blocks; //該文件所占的磁盤塊 }; */ /*根據文件名獲取文件inode-number*/ ino_t get_ino_byname(char *filename) { struct stat file_stat; if (0 != stat(filename, &file_stat)) { perror("stat"); exit(-1); } return file_stat.st_ino; } /*根據inode-number ,在當前目錄中查找對應的文件名*/ char* find_name_byino(ino_t ino) { DIR *dp = NULL; struct dirent *dptr = NULL; char *filename = NULL; if (NULL == (dp = opendir("."))) { fprintf(stderr, "Can not open Current Directory\n"); exit(-1); } else { while (NULL != (dptr = readdir(dp))) { if (dptr->d_ino == ino) { filename = strdup(dptr->d_name); break; } } closedir(dp); } return filename; } /*限制最大的目錄深度*/ #define MAX_DIR_DEPTH (256) int main(int argc, char *argv[]) { /*記錄目錄名的棧*/ char *dir_stack[MAX_DIR_DEPTH]; unsigned current_depth = 0; for(;;) { /*1.通過特殊的文件名“.”獲取當前目錄的inode-number*/ ino_t current_ino = get_ino_byname("."); /*2.通過特殊的文件名“..”獲取當前目錄的父級目錄的inode-number*/ ino_t parent_ino = get_ino_byname(".."); /*3.判斷當前目錄和上級目錄的inode-number是否一樣*/ if (current_ino == parent_ino) break; /*4.如果兩個inode-number一樣說明到達根目錄*/ /*5.如果兩個inode-number不一樣*/ /*切換至父級目錄,根據步驟1獲取的inode-number,在父級目錄中搜索對應的文件名並記錄下來, 重新回到步驟1*/ chdir(".."); dir_stack[current_depth++] = find_name_byino(current_ino); if (current_depth>=MAX_DIR_DEPTH) { /*路徑名太深*/ fprintf(stderr, "Directory tree is too deep.\n"); exit(-1); } } /*輸出完整路徑名*/ int i = current_depth-1; for (i = current_depth-1; i>=0; i--) { fprintf(stdout, "/%s", dir_stack[i]); } fprintf(stdout, "%s\n", current_depth==0?"/":""); return 0; }
在linux 中的文件系統中,文件=N(N>=1)個inode +M(M>=1)個數據塊。
數據塊,存放文件的內容數據,數據塊的數目根據文件內容的大小而定。
inode稱為信息節點,其作用有二:1、存儲跟文件相關的屬性信息,如修改時間、所有者、文件類型和文件長度,注意這些信息里並沒有文件名;2、存儲指向文件內容數據塊的指針信息。
在一個文件系統中,一個inode代表一個文件,並使用一個整數值來標志該inode,稱為inode-number,該值對於一個文件系統而言是唯一的,即通過該值可以找到其對應的inode。一般情況下,一個文件只有一個inode信息用來描述它。
