1. 程式人生 > >SylixOS文件狀態獲取

SylixOS文件狀態獲取

sylixos


  1. 文件狀態介紹

    SylixOS中文件的狀態信息包含在stat結構體中,其中包含了文件大小,設備標識符,用戶標識符,用戶組標識符,文件模式,擴展屬性,文件讀取或修改的時間戳,鏈接數量,指向存儲該內容的磁盤區塊的指針,文件分類等等。

    SylixOS中維護的stat結構體如圖 1.1所示。

    技術分享

    1.1 stat結構體成員

  2. 文件狀態獲取函數

  3. 文件狀態獲取函數介紹

    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函數將獲得符號鏈接的相關信息,而不是符號鏈接指向的實際的文件的信息。

  4. 目錄下全文件狀態獲取

    獲取目錄下所有文件的狀態信息,需要涉及到對當前目錄以及子目錄的讀寫操作。

    在使用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;
                charpath2[50] = {0};
                strcpy(path2, path);
     
                /*
                 * 路徑拼接
                 */
                strcat(path2, entry->d_name);
                strcat(path2, "/");
                ret = lstat(path2, &statbuf);
                if (ret) {
                 printf("err!\n");
                 break;
                }
     
                if(S_ISDIR(statbuf.st_mode)){
                    printf("Dir:%s\n", path2);
                    /*
                     * 遞歸調用
                     */
                    printdir(path2);
                }else{
                    printf("File:%s\n", path2);
                }
            }
     
        }
        closedir(dir);
    }
     
     
    int main (int argc, char **argv)
    {
        printdir(argv[1]);
     
        return (0);
    }



SylixOS文件狀態獲取