Linux C編程第九章 目錄操作相關函數

      網友投稿 854 2025-04-04

      一、整體大綱

      二、相關函數

      1. getcwd

      函數作用:獲取當前目錄

      頭文件

      #include

      函數原型

      char *getcwd(char *buf, size_t size);

      參數說明:

      buf傳出參數,路徑

      size緩沖區大小

      返回值

      成功:返回路徑的指針

      失敗:返回NULL

      2. chdir

      函數作用:改變工作路徑

      頭文件

      #include

      函數原型

      int chdir(const char *path);

      函數參數:

      path對應的目標工作路徑

      返回值

      成功:返回0

      失敗:返回-1,設置errno

      注意:改變工作路徑-注意屬于進程獨有。

      示例:

      chdir示例

      1 #include 2 #include 3 #include 4 #include 5 #include 6 7 int main(int argc, char *argv[]) 8 { 9 if (argc != 2) 10 { 11 printf("./a.out filename\n"); 12 return -1; 13 } 14 15 //先切換工作目錄 16 chdir(argv[1]); 17 18 int fd = open("temp.txt", O_WRONLY|O_CREAT, 0666); 19 write(fd, "daociyiyou", 10); 20 close(fd); 21 22 //獲取當前工作目錄 23 char buf[256] = {0}; 24 getcwd(buf, sizeof(buf)); 25 printf("buf is %s\n", buf); 26 27 return 0; 28 }

      3. mkdir

      函數作用:創建目錄

      頭文件

      #include #include

      函數原型

      int mkdir(const char *pathname, mode_t mode);

      參數說明:

      pathname創建的目錄路徑

      mode目錄權限 (mode & ~umask & 01777),注意權限,如果目錄沒有可執行權限,不可進入

      返回值

      成功:返回0

      失敗:返回-1,設置errno

      4. rmdir

      函數作用:只能刪除空文件夾

      5. opendir

      函數作用:打開目錄

      頭文件

      #include #include

      函數原型

      DIR *opendir(const char *name);

      參數說明:

      pathname打開的目錄

      返回值

      成功:返回指向該目錄流的指針

      失敗:返回-1,設置errno

      6. readdir

      函數作用:讀目錄

      頭文件

      #include

      函數原型

      struct dirent *readdir(DIR *dirp);

      參數說明:

      dirp傳入參數,opendir返回的指針

      返回值

      成功:讀到目錄項的內容

      失敗:NULL代表讀到末尾或者有錯誤

      struct dirent { ino_t d_ino; /* inode number */ off_t d_off; /* not an offset; see NOTES */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; /* type of file; not supported by all file system types */ char d_name[256]; /* filename */ };

      7. closedir

      函數作用:關閉目錄

      頭文件

      #include #include

      函數原型

      【Linux C編程】第九章 目錄操作相關函數

      int closedir(DIR *dirp);

      函數參數:

      dirp傳入參數,opendir返回的指針

      返回值

      成功:返回0

      失敗:返回-1,設置errno

      需求:統計一下指定目錄下的文件個數?

      統計指定目錄下文件個數

      1 #include 2 #include 3 #include 4 #include 5 #include 6 7 int count = 0; 8 9 int DirCount(char *dirname) 10 { 11 printf("================dirname:%s================\n", dirname); 12 //打開目錄 13 DIR *dirp = opendir(dirname); 14 if (NULL == dirp) 15 { 16 perror("opendir err:"); 17 return -1; 18 } 19 //循環讀目錄,如果是普通文件,count++,如果是目錄,繼續調用DirCount 20 struct dirent *dentp = NULL; 21 while ((dentp = readdir(dirp)) != NULL) 22 { 23 if (dentp->d_type == DT_DIR) //如果是目錄 24 { 25 if (strcmp(dentp->d_name, ".") == 0 || strcmp(dentp->d_name, "..") == 0) 26 { 27 continue; 28 } 29 printf("================dirname:%s, dtype:%d================\n", dentp->d_name, dentp->d_type); 30 //注意進程的工作路徑,不能直接打開子目錄 31 //使用dirname拼接下一級子目錄 32 char newdirname[256] = {0}; 33 sprintf(newdirname, "%s/%s", dirname, dentp->d_name); 34 DirCount(newdirname); 35 } 36 if (dentp->d_type == DT_REG) 37 { 38 count++; 39 printf("-------------filename:%s, dtype:%d------------\n", dentp->d_name, dentp->d_type); 40 } 41 } 42 //關閉目錄 43 closedir(dirp); 44 return 0; 45 } 46 47 int main(int argc, char *argv[]) 48 { 49 if (argc != 2) 50 { 51 printf("./a.out dirname\n"); 52 return -1; 53 } 54 DirCount(argv[1]); 55 printf("total file count %d\n", count); 56 57 return 0; 58 }

      8. dup2

      函數作用:文件描述符重定向

      頭文件

      #include

      函數原型

      int dup2(int oldfd, int newfd);

      參數說明:

      關閉newfd對應的文件描述符,將newfd重新指向為old對應的文件

      返回值

      成功:返回0

      失敗:返回-1,設置errno

      9. dup

      函數作用:復制文件描述符

      頭文件

      #include

      函數原型

      int dup(int oldfd);

      參數說明:

      新返回一個文件描述符指向oldfd對應的文件

      返回值

      成功:返回0

      失敗:返回-1,設置errno

      需求:在代碼中執行2次printf("hello world\n");一次輸出到hello文件,后一次輸出到屏幕上?

      需求實現

      1 #include 2 #include 3 #include 4 #include 5 #include 6 7 int main(int argc, char *argv[]) 8 { 9 if (argc != 2) 10 { 11 printf("./a.out filename\n"); 12 return -1; 13 } 14 //先備份現場 15 int outfd = dup(1); 16 //先做重定向 17 int fd = open(argv[1], O_WRONLY|O_CREAT, 0666); 18 dup2(fd, 1); 19 printf("Hello world\n"); 20 //必須刷新 21 fflush(stdout); 22 23 //需要回復1,重新對應標準輸出 24 dup2(outfd, 1); 25 printf("Hello world\n"); 26 27 close(fd); 28 29 return 0; 30 }

      10.?errno

      函數作用:輸出函數,根據errnum得到相應的錯誤信息

      頭文件

      #include

      函數原型:

      char *strerror(int errnum);

      11.?fcntl

      改變已經打開的文件的屬性

      打開文件的時候: 只讀

      修改文件的: 添加追加 O_APPEND

      三、補充

      1. 索引節點inode

      保存的其實是實際的數據的一些信息,這些信息稱為“元數據”(也就是對文件屬性的描述)。例如:文件大小,設備標識符,用戶標識符,用戶組標識符,文件模式,擴展屬性,文件讀取或修改的時間戳,鏈接數量,指向存儲該內容的磁盤區塊的指針,文件分類等等。( 注意數據分成:元數據+數據本身 )

      注意inode怎樣生成的:每個inode節點的大小,一般是128字節或256字節。inode節點的總數,在格式化時就給定(現代OS可以動態變化),一般每2KB就設置一個inode。一般文件系統中很少有文件小于2KB的,所以預定按照2KB分,一般inode是用不完的。所以inode在文件系統安裝的時候會有一個默認數量,后期會根據實際的需要發生變化。

      注意inode號:inode號是唯一的,表示不同的文件。其實在Linux內部的時候,訪問文件都是通過inode號來進行的,所謂文件名僅僅是給用戶容易使用的。當我們打開一個文件的時候,首先,系統找到這個文件名對應的inode號;然后,通過inode號,得到inode信息,最后,由inode找到文件數據所在的block,現在可以處理文件數據了。

      2. inode和文件的關系

      當創建一個文件的時候,就給文件分配了一個inode。一個inode只對應一個實際文件,一個文件也會只有一個inode。inodes最大數量就是文件的最大數量。

      C 語言 Linux

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:掃描儀功能最近消失 2019XPS(掃描儀忽然用不了是什么情況)
      下一篇:怎么在excel表格中繪制出條形碼圖形
      相關文章
      亚洲人成影院在线观看| 国产成人精品日本亚洲语音 | 78成人精品电影在线播放日韩精品电影一区亚洲| 亚洲精品无码AV中文字幕电影网站| 成a人片亚洲日本久久| 精品久久久久亚洲| 午夜亚洲国产成人不卡在线| 五月婷婷亚洲综合| 亚洲精品国产va在线观看蜜芽| 亚洲国产成人乱码精品女人久久久不卡 | 亚洲AV成人片无码网站| 亚洲国产精品网站在线播放 | 亚洲国产成人无码AV在线影院| 亚洲熟伦熟女专区hd高清| 亚洲午夜无码毛片av久久京东热| 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | 亚洲乱码在线播放| 亚洲人成77777在线观看网| 亚洲欧美日韩国产成人| 亚洲av成人中文无码专区| www.亚洲色图| 久久亚洲AV永久无码精品| 亚洲男同帅GAY片在线观看| 亚洲VA中文字幕无码一二三区| 亚洲欧洲日韩不卡| 亚洲毛片在线免费观看| 亚洲伊人久久大香线蕉结合| 亚洲色大情网站www| 处破女第一次亚洲18分钟| 精品亚洲视频在线观看| 国产aⅴ无码专区亚洲av| 亚洲一区二区三区夜色| 亚洲国产成人精品电影| 亚洲精品无码久久| 亚洲黄片毛片在线观看| 亚洲成色WWW久久网站| 亚洲美女视频网站| jlzzjlzz亚洲jzjzjz| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲人成无码网站久久99热国产| 亚洲国产精品乱码一区二区|