一、什麼是struct dirent
struct dirent(directory entry)是Unix/Linux系統中用來描述目錄項的結構體,應用程序通過調用操作系統提供的readdir()函數讀取目錄中的文件和子目錄,並通過struct dirent結構體來描述它們。
struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
unsigned short d_reclen; /* Length of this record */
unsigned char d_type; /* Type of file; one of the DT_XXX constants */
char d_name[256]; /* Null-terminated filename */
};
struct dirent結構體中包含五個成員變數,分別是:
d_ino:文件或目錄的inode節點號;
d_off:目錄項在目錄文件中的偏移量。在Linux中,當應用程序讀取目錄時,d_off被設置為下一個目錄項的偏移量(即讀完當前目錄項後,下一個讀取的目錄項的偏移量為d_off);
d_reclen:這個目錄項的長度。在多數文件系統中,這個值等於d_name的長度加上些許的額外控制信息長度;
d_type:描述目錄項所指向的文件類型(文件類型的定義和取值是系統相關的);
d_name:目錄項所指向的文件或目錄的名字,是一個字元串數組,不同系統有不同的d_name長度上限,常用的是256位元組。
二、如何使用struct dirent
使用struct dirent需要先打開目錄,並調用readdir()函數來獲取目錄中的文件和子目錄信息。
示例代碼如下:
DIR *dir;
struct dirent *ent;
dir = opendir("/path/to/dir");
while ((ent = readdir (dir)) != NULL) {
printf ("%sn", ent->d_name);
}
closedir(dir);
上面代碼中,opendir()函數打開目錄並返回一個目錄流指針,readdir()函數讀取目錄中的文件和子目錄信息並返回一個指向struct dirent的指針,使用指針ent->d_name獲取目錄項的名字。
三、注意事項
在使用struct dirent時,有一些需要注意的事項:
1. d_name欄位長為256個位元組,但不同的文件系統有不同的限制,有些文件系統可能會把文件名縮短到12到14個字元長度,以便把額外的文件信息同時存儲在磁碟中。
2. d_type欄位可能會被設置成一些系統特定的值,而這些值的定義也會隨著系統版本的更新而發生改變,所以如果要編寫可移植的程序,就需要避免使用d_type欄位。
3. readdir()讀取目錄項時,每讀取一次就會返回下一個目錄項,直到讀取完了目錄中的所有項,如果想要重複讀取,就要關閉目錄流並再次打開。
四、示例代碼
下面展示一個遍歷目錄中所有文件和子目錄的示例代碼:
void traverseDir(char *basePath) {
DIR *dir;
struct dirent *entry;
if ((dir = opendir(basePath)) == NULL) {
fprintf(stderr, "Cannot open directory:%sn",basePath);
return;
}
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
printf("%s/%sn", basePath, entry->d_name);
if (entry->d_type == DT_DIR) {
char path[1000];
sprintf(path, "%s/%s", basePath, entry->d_name);
traverseDir(path);
}
}
closedir(dir);
}
int main() {
traverseDir("/path/to/dir");
return 0;
}
第一個while循環遍歷目錄下的所有文件和子目錄,並列印文件和子目錄的名字。
第二個if語句判斷,如果當前目錄項名字為”.”或”..”,則跳過該項,否則繼續遍歷該目錄項。
第二個if語句判斷如果當前目錄項是子目錄,則遞歸遍歷該子目錄。
五、總結
struct dirent提供了Unix/Linux系統下操作目錄和文件的基本結構體,通過readdir()函數讀取目錄中的文件和子目錄,並通過struct dirent結構體來描述它們,使用該結構體可以完成對目錄的遍歷等操作。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193112.html