opendir、readdir和closedir函數

注意:Linux中,目錄的輸入格式:/mnt//fghs/mnt/fghs/mnt/fghs/mnt/fghs//是等效的,都一樣。

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

DIR *fdopendir(int fd);

返回值:出錯返回NULL,并可以通過perror函數查看詳細錯誤信息;成功,則返回一個DIR *類型的指針,該指針指向一個DIR類型的結構體,該結構體描述了所打開的目錄的一些信息。可以類比open函數:FILE * fp=open( );打開一個文件,則返回一個FILE *類型的指針:包含了文件描述符、文件讀寫指針和I/O緩沖區三部分。則打開一個目錄,返回一個DIR *類型的指針(目錄指針),利用該指針可以對打開的目錄進行讀操作和關閉該目錄

?

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

作用:讀一個打開了的目錄,該函數可以自動遍歷目錄內部所有的文件,一個個自動進行遍歷,直到全部遍歷完。

返回值:成功,則返回一個struct dirent *類型的指針,指向struct dirent *結構體,該結構體包含了該目錄中某一個文件的詳細信息,包括:

struct dirent

{

??? ino_t ??d_ino; ?// 此目錄進入點(該文件)的inode

??? ff_t ???d_off;? // 目錄文件開頭至此目錄進入點的位移(目錄內文件為1,目錄內的目錄內部文件為2等等)

??? signed short int ??d_reclen; ??// d_name 的長度, 不包含NULL字符(0、\0)

? ??unsigned char?? ?d_type;????? // d_name 所指的文件類型

??? har? ?d_name[256];??? ?????? // 文件名(字符串類型)

};??? ?//后兩個成員常用,記住!!

對于d_type的說明(宏定義):DT_BLK 塊設備文件 ??DT_CHR 字符設備? DT_DIR 目錄文件? DT_LNK 軟鏈接文件? DT_FIFO管道文件?? DT_REG? 普通文件??? DT_SOCK? 套接字文件???? DT_UNKNOW? 未知?? ?-D_BSD_SOURCE 編譯時添加宏定義

則遍歷到哪一個文件,則就返回該文件對應的struct dirent結構體。遍歷完目錄內部的最后一個文件后,會返回NULL,因此判斷一個目錄是否遍歷完,判斷其返回值是否為NULL即可,此時不代表出錯,因此不會改變errno的值。若函數出錯,也會返回NULL,且會修改errno的值。

?

#include <sys/types.h>

#include <dirent.h>

int closedir(DIR *dirp);

作用:關閉目錄文件? 注意,打開目錄后,不要忘記關閉。

返回值:0 成功? -1失敗

?

//遞歸讀一個目錄,統計一個目錄內部所有普通文件的個數(注意是遞歸,包括子目錄)。

[root@localhost dir_op]# vim read_file_num.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int countFileNum( const char * );  //函數聲明int countFileNum( const char *dirName ) //定義一個統計普通文件數目的函數
{DIR *dir=NULL;dir = opendir(dirName);  //打開需要統計的目錄if( dir == NULL ){perror("opendir");exit(1);}struct dirent *fx = NULL;fx = readdir( dir );   //讀該目錄,注意是每讀一次,就自動遍歷到下一個文件,因此必須要讀一次,才能遍歷到下一個文件。if( fx == NULL ){perror("readdir");exit(1);}int total=0;char buff[1024]={0};  //建立緩沖區while( fx )   //fx為NULL,則循環結束{if( strcmp(fx->d_name , ".") == 0 || strcmp( fx->d_name , "..") == 0 ){fx = readdir( dir );  //必須讀一次,否則陷入死循環continue;}                  //字符串比較函數,排除.和..(當前目錄和上級目錄)if( fx->d_type == DT_DIR )  //如果是目錄文件,則遞歸調用,注意遞歸思想{sprintf( buff,"%s/%s",dirName,fx->d_name );  //d_name只是目錄本身的名字,不包含路勁(上級目錄等)total += countFileNum( buff );}if( fx->d_type == DT_REG )total++;fx = readdir( dir );   //必須要讀一次,否則不會遍歷下一個文件}int qw = 0;qw = closedir(dir);if( qw==-1 ){perror("closedir");exit(1);}       //關閉目錄return total;
}int main( int argc , char *argv[ ] )
{if( argc < 2 ){printf( "./a.out dirName\n");exit(1);}int num = 0;num = countFileNum( argv[1] );printf( " the number of reg file is %d.\n",num);return 0;
}

[root@localhost dir_op]# gcc -pipe -Wall -pedantic -ggdb3 read_file_num.c -o read_file_num

[root@localhost dir_op]# ls

a.out? chdir? chdir.c? fileNum? fileNum.c? haha.c? hehe.c? mkdir.c? mytest? opendir.c? readdir.c? read_file_num? read_file_num.c

[root@localhost dir_op]# ./read_file_num .

?the number of reg file is 13. ??//成功統計出當前目錄中的普通文件數為13.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385385.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

146. LRU緩存機制

運用你所掌握的數據結構&#xff0c;設計和實現一個 LRU (最近最少使用) 緩存機制。它應該支持以下操作&#xff1a; 獲取數據 get 和 寫入數據 put 。 獲取數據 get(key) - 如果密鑰 (key) 存在于緩存中&#xff0c;則獲取密鑰的值&#xff08;總是正數&#xff09;&#xff…

dup和dup2函數

#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); 作用&#xff1a;dup函數實現對一個文件的文件描述符進行復制&#xff0c;復制之后該進程就會新增加一一個文件描述符指向該文件&#xff08;即實現同一個文件對應多個文件描述符&#xff0…

fcntl函數(網絡編程會用)

#include <unistd.h> #include <fcntl.h> int fcntl&#xff08;int fd, int cmd&#xff09;&#xff1b; int fcntl&#xff08;int fd, int cmd, long arg&#xff09;&#xff1b;//long 長整型 int fcntl&#xff08;int fd, int cmd, struct flock *lock…

189. 旋轉數組

給定一個數組&#xff0c;將數組中的元素向右移動 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,6] 向右旋轉 2 步: [6,7,1,2,3,4,5] 向右旋轉 3 步: [5,6,7,1,2,3,4]示例 2: 輸…

58. 最后一個單詞的長度

給定一個僅包含大小寫字母和空格 的字符串&#xff0c;返回其最后一個單詞的長度。 如果不存在最后一個單詞&#xff0c;請返回 0 。 說明&#xff1a;一個單詞是指由字母組成&#xff0c;但不包含任何空格的字符串。 示例: 輸入: "Hello World" 輸出: 5 clas…

CPU和MMU(內存管理單元)

CPU的架構&#xff1a;要求能夠理解從源程序到微指令的整個經歷過程&#xff1a;存儲器的層次結構&#xff08;網絡資源下載到硬盤、磁盤緩存、內存、Cache、寄存器&#xff09;&#xff1b;CPU的四大部分&#xff1a;ALU、CU、中斷系統和寄存器&#xff1b;程序執行的整個過程…

【C++ Primer | 09】容器適配器

一、stack s.push(): 向棧內壓入一個成員&#xff1b; s.pop(): 從棧頂彈出一個成員&#xff1b; s.empty(): 如果棧為空返回true&#xff0c;否則返回false&#xff1b; s.top(): 返回棧頂&#xff0c;但不刪除成員&#xff1b; s.size(): 返回棧內元素…

進程控制塊PCB(進程描述符)

&#xff08;1&#xff09;PCB 每個進程在內核中都有一個進程控制塊&#xff08;PCB&#xff09;來維護進程相關的信息&#xff0c;Linux內核的進程控制塊是task_struct結構體。grep -r “task_struct” / 可以查找根目錄下&#xff0c;包含task_struct的文件文件。或者 find…

103. 二叉樹的鋸齒形層次遍歷

給定一個二叉樹&#xff0c;返回其節點值的鋸齒形層次遍歷。&#xff08;即先從左往右&#xff0c;再從右往左進行下一層遍歷&#xff0c;以此類推&#xff0c;層與層之間交替進行&#xff09;。 例如&#xff1a; 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 /…

fork、getpid、getppid函數

#include <unistd.h> pid_t fork(void); 作用&#xff1a;創建一個子進程。 到目前為止&#xff0c;我們可以直到兩種創建進程的方法&#xff1a;1. 通過執行二進制文件來創建一個進程&#xff0c;如&#xff1a;./a.out /bin/ls&#xff1b;2.通過fork函數來創建一個…

107. 二叉樹的層次遍歷 II

給定一個二叉樹&#xff0c;返回其節點值自底向上的層次遍歷。 &#xff08;即按從葉子節點所在層到根節點所在的層&#xff0c;逐層從左向右遍歷&#xff09; 例如&#xff1a; 給定二叉樹 [3,9,20,null,null,15,7], 3/ \9 20/ \15 7返回其自底向上的層次遍歷為&#xff…

循環創建N個子進程

以循環創建5個進程為例&#xff0c;給出如下代碼&#xff0c;分析其錯誤&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h>int main(void) {int i;pid_t pid;printf("xxxxxxxxxxx\n");for (i 0; i < 5; i){pid fork…

【C++ Primer | 19】控制內存分配

1. 測試代碼&#xff1a; #include <iostream> #include <new> #include <cstring> #include <cstdlib> using namespace std;void* operator new(size_t size) {cout << "global Override operator new" << endl;if (void* p…

getuid、geteuid、getgid和getegid函數

#include <unistd.h> #include <sys/types.h> uid_t getuid(void); uid_t geteuid(void); 作用&#xff1a;getuid返回當前進程的實際用戶ID&#xff1b;geteuid返回當前用戶的有效用戶ID。這兩個總是成功&#xff0c;不會失敗。 #include <unistd.h> #…

【第15章】虛函數

一、為什么基類中的析構函數要聲明為虛析構函數&#xff1f; 直接的講&#xff0c;C中基類采用virtual虛析構函數是為了防止內存泄漏。具體地說&#xff0c;如果派生類中申請了內存空間&#xff0c;并在其析構函數中對這些內存空間進行釋放。假設基類中采用的是非虛析構函數&am…

進程共享(讀時共享寫時復制)

父子進程之間在剛fork后。父子相同處: 全局變量、.data、.bbs、.text、棧、堆、環境變量、用戶ID、宿主目錄&#xff08;進程用戶家目錄&#xff09;、進程工作目錄、信號處理方式等等&#xff0c;即0~3G的用戶空間是完全一樣的。父子不同處: 1.進程ID 2.fork返回值 3.父進…

【C++ Primer | 08】IO庫

一、istringstream類 描述&#xff1a;從流中提取數據&#xff0c;支持 >> 操作 這里字符串可以包括多個單詞&#xff0c;單詞之間使用空格分開 #include <iostream> #include <sstream> using namespace std; int main() {istringstream istr(&quo…

gdb調試(如何跟蹤指定進程)

使用gdb調試的時候&#xff0c;gdb只能跟蹤一個進程。可以在fork函數調用之前&#xff0c;通過指令設置gdb調試工具跟蹤父進程或者是跟蹤子進程。默認跟蹤父進程。 set follow-fork-mode child 命令設置gdb在fork之后跟蹤子進程。 set follow-fork-mode parent 設置跟蹤父進程…

【Leetcode | 01】Backtracking

回溯算法序號題號117. 電話號碼的字母組合222. 括號生成 39. 組合總和 40. 組合總和 II 46. 全排列 47. 全排列 II 60. 第k個排列 77. 組合 78. 子集 90. 子集 II 93. 復原IP地址 131. 分割回文串 216. 組合總和 III 306. 累加數 357. 計算各個位數不同的數字個數 401. 二進…

1033. 舊鍵盤打字(20)

舊鍵盤上壞了幾個鍵&#xff0c;于是在敲一段文字的時候&#xff0c;對應的字符就不會出現。現在給出應該輸入的一段文字、以及壞掉的那些鍵&#xff0c;打出的結果文字會是怎樣&#xff1f; 輸入格式&#xff1a; 輸入在2行中分別給出壞掉的那些鍵、以及應該輸入的文字。其中對…