前言
在之前的文章中,描述過如何用 fcntl 函式改變檔案的狀態標記。但,檔案還有很多資訊,如檔案型別,許可權設定,裝置編號,訪問時間等等。如果要獲取這些資訊,則使用函式 lstat 可以輕鬆達到這個目的。
下面的程式將使用該函式獲取檔案型別資訊並判斷它的型別。
但在這之前,先要說明檔案資訊結構體和檔案型別判定巨集。
檔案資訊結構體
呼叫 lstat 函式將會把指定檔案的資訊存放到 stat 結構體中,這個結構體的定義大致如下:
檔案型別判定巨集
檔案結構體中的檔案型別欄位是一個整數,對此,可以使用如下判定巨集來獲知判定物件所屬的檔案型別:
程式碼示例
1 #include "apue.h" 2 3 int 4 main(int argc, char *argv[]) 5 { 6 int i; 7 struct stat buf; 8 char *ptr; 9 10 for (i = 1; i < argc; i++) { 11 // 輸出要判斷的檔名 12 printf("%s: ", argv[i]); 13 14 // 執行 lstat 函式後,檔案的資訊就存放在了結構體 buf 中。 15 if (lstat(argv[i], &buf) < 0) { 16 err_ret("lstat error"); 17 continue; 18 } 19 20 // 執行判定巨集,對結構體中的檔案型別變數進行判定。 21 if (S_ISREG(buf.st_mode)) 22 ptr = "regular"; 23 else if (S_ISDIR(buf.st_mode)) 24 ptr = "directory"; 25 else if (S_ISCHR(buf.st_mode)) 26 ptr = "character special"; 27 else if (S_ISBLK(buf.st_mode)) 28 ptr = "block special"; 29 else if (S_ISFIFO(buf.st_mode)) 30 ptr = "fifo"; 31 else if (S_ISLNK(buf.st_mode)) 32 ptr = "symbolic link"; 33 else if (S_ISSOCK(buf.st_mode)) 34 ptr = "socket"; 35 else 36 ptr = "** unknown mode **"; 37 printf("%s\n", ptr); 38 } 39 exit(0); 40 }
執行測試
建立一個測試檔案,並用該程式判斷其檔案型別。
小結
1. 當判定連結型別檔案時,如果需要判定的物件是連結檔案所連結的那個檔案而非此連結檔案本身的話,則應當使用 stat 函式。
2. 當希望通過檔案描述符指定檔案時,則應當使用 fstat 函式。