您好,登錄后才能下訂單哦!
SylixOS中文件的狀態信息包含在stat結構體中,其中包含了文件大小,設備標識符,用戶標識符,用戶組標識符,文件模式,擴展屬性,文件讀取或修改的時間戳,鏈接數量,指向存儲該內容的磁盤區塊的指針,文件分類等等。
SylixOS中維護的stat結構體如圖 1.1所示。
圖 1.1 stat結構體成員
SylixOS中獲取文件狀態可以使用stat、lstat和fstat等函數。如圖 2.1所示。
圖 2.1獲取文件狀態函數原型
函數fstat原型分析:成功返回0,失敗返回-1,并設置錯誤號。參數iFd是文件描述符,輸出參數pstat返回文件狀態信息。
函數stat原型分析:成功返回0,失敗返回-1,并設置錯誤號。參數pcName是文件名,輸出參數pstat返回文件狀態信息。
函數lstat原型分析:成功返回0,失敗返回-1,并設置錯誤號。參數pcName是文件名,輸出參數pstat返回文件狀態信息。
stat函數類似于lstat函數,區別是當傳入的文件名是符號鏈接時,lstat函數將獲得符號鏈接的相關信息,而不是符號鏈接指向的實際的文件的信息。
獲取目錄下所有文件的狀態信息,需要涉及到對當前目錄以及子目錄的讀寫操作。
在使用opendir函數打開一個目錄文件之后,使用readdir函數來獲取一個已經打開目錄的單條信息。所以為了獲取目錄下及其子目錄下所有文件信息的時候,需要多次調用readdir函數來讀取目錄信息,readdir函數執行失敗返回NULL,成功返回dirent結構體指針,dirent結構體成員如圖 2.2所示。
圖 2.2 dirent結構體成員
成員變量d_name保存了文件名信息,但是需要注意的是,此文件名不可以直接用作stat或lstat函數的pcName參數傳入,否則調用容易失敗。原因是因為d_name返回的文件名是不帶路徑的一個字符串,當調用stat或者lstat獲取非當前目錄文件的狀態信息時,由于當前目錄沒有發生改變,傳入非當前目錄下的文件名則失敗。所以可以通過字符拼接構造出正確的相對或者絕對路徑傳入stat或者lstat函數,完成對所有目錄下文件狀態的獲取工作。
下面的程序完成了對傳入的路徑下所有文件狀態中文件類型的打印。見程序清單 2.1。
程序清單 2.1實例代碼
#include<stdio.h> #include<unistd.h> #include<fcntl.h> #include<sys/stat.h> #include<string.h> /********************************************************************************************************* ** 函數名稱: printdir ** 功能描述: 遍歷當前目錄下的文件和目錄并通過控制臺輸出顯示 ** 輸 入 : 目錄路徑 ** 輸 出 : ** 全局變量: ** 調用模塊: *********************************************************************************************************/ void printdir (char *path) { DIR *dir = NULL; struct dirent *entry = NULL; struct stat statbuf = {0}; dir = opendir(path); if (!dir) { printf("failed to open current directory!\n"); return ; } while(1) { entry = readdir(dir); if (entry == NULL){ break; }else{ intret = 0; charpath3[50] = {0}; strcpy(path3, path); /* * 路徑拼接 */ strcat(path3, entry->d_name); strcat(path3, "/"); ret = lstat(path3, &statbuf); if (ret) { printf("err!\n"); break; } if(S_ISDIR(statbuf.st_mode)){ printf("Dir:%s\n", path3); /* * 遞歸調用 */ printdir(path3); }else{ printf("File:%s\n", path3); } } } closedir(dir); } int main (int argc, char **argv) { printdir(argv[1]); return (0); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。