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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。