首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

APUE 文件與目錄操作(下):目錄創建刪除、讀取遍歷、工作目錄管理

     編輯:關於C語言

APUE 目錄操作全解:mkdir/rmdir、目錄遍歷、chdir/getcwd

本文涵蓋目錄創建刪除權限細節、POSIX 標準目錄讀取接口、進程工作目錄管理機制。

一、mkdir 與 rmdir

mkdir - 創建目錄

#include 
#include 
int mkdir(const char *pathname, mode_t mode);
// 成功 0,失敗 -1

關鍵點:

  • 自動創建 . 和 .. 目錄項
  • mode 會被進程 umask 修改
  • 必須包含執行權限位(如 0755),否則無法 cd 進入或訪問其中文件
  • 常見錯誤:僅指定 S_IRUSR | S_IWUSR(0600),缺少執行位

rmdir - 刪除空目錄

#include 
int rmdir(const char *pathname);

僅能刪除空目錄。若連接計數歸零且無進程打開,釋放空間;若有進程打開,延遲至最後關閉時釋放,但期間禁止在該目錄創建新文件。

二、目錄讀取:POSIX 標準接口

早期系統目錄格式不一(如 V7 每項 16 字節),現代系統統一使用 <dirent.h> 接口:

#include 
#include 

DIR *opendir(const char *pathname);           // 打開目錄流
struct dirent *readdir(DIR *dp);              // 讀取下一項
void rewinddir(DIR *dp);                      // 重置讀取位置
int closedir(DIR *dp);                        // 關閉目錄流

dirent 結構體(最小定義)

struct dirent {
    ino_t  d_ino;                    // i-node 編號
    char   d_name[NAME_MAX + 1];     // 文件名(以 null 結尾)
};

注意:POSIX 僅規定 d_name,d_ino 為實現相關;NAME_MAX 值依文件系統而異(常見 255),可用 fpathconf 獲取。

目錄遍歷範例

void list_dir(const char *path) {
    DIR *dp = opendir(path);
    if (!dp) { perror("opendir"); return; }

    struct dirent *entry;
    while ((entry = readdir(dp)) != NULL) {
        printf("%s\n", entry->d_name);
    }
    closedir(dp);
}

順序與文件系統實現相關,通常非字母序。

三、工作目錄管理

chdir / fchdir - 切換工作目錄

#include 
int chdir(const char *pathname);
int fchdir(int fd);  // 通過文件描述符切換

僅影響當前進程,不影響其他進程。內核僅記錄 i-node 號與設備號,不存完整路徑。

getcwd - 獲取絕對路徑

#include 
char *getcwd(char *buf, size_t size);
// 成功返回 buf,失敗 NULL

實現原理:從當前目錄向上遞歸查找 .. 中匹配當前 i-node 的項,層層向上至根目錄拼湊路徑。buf 需足夠大(含結束符),否則失敗。

實務建議

  • 創建目錄務必加執行權限:mkdir(path, 0755)
  • 遍歷目錄時檢查 readdir 返回 NULL 區分結束與出錯(需配合 errno)
  • 長路徑場景動態分配 getcwd 緩衝區:getcwd(NULL, 0) (GNU 擴展) 自動分配
  • 多線程環境下 chdir 影響全局,謹慎使用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved