C 語言中獲取當前工作目錄

Jinku Hu 2023年10月12日
  1. 使用 getcwd 函式獲取當前工作目錄的方法
  2. 在 C 語言中正確驗證 getcwd 函式返回的值以獲取當前工作目錄
  3. 使用 get_current_dir_name 函式獲取當前工作目錄
C 語言中獲取當前工作目錄

本文將介紹幾種在 C 語言中獲取當前工作目錄的方法。

使用 getcwd 函式獲取當前工作目錄的方法

getcwd 函式是一個符合 POSIX 標準的系統呼叫,可以檢索呼叫程式的當前工作目錄。getcwd 需要兩個引數 - char* 緩衝區,其中儲存路徑名,以及給定緩衝區中分配的位元組數。該函式將當前工作目錄的名稱儲存為一個空頭字串,使用者有責任保證 char* 地址有足夠的空間來儲存路徑名。注意,getcwd 返回的是目錄的絕對路徑名。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  getcwd(path, MAX_BUF);
  printf("Current working directory: %s\n", path);

  exit(EXIT_SUCCESS);
}

在 C 語言中正確驗證 getcwd 函式返回的值以獲取當前工作目錄

getcwd 函式可能無法檢索到正確的值;因此,在這種情況下,它返回 NULL,並設定 errno 與相應的錯誤程式碼。使用者負責實現錯誤檢查程式碼,並根據需要修改程式的控制流程,以適應特定情況。需要注意的是,我們在呼叫 getcwd 函式之前將 errno 顯式地設定為零,因為最好的做法是在呼叫到答應設定 errno 的庫函式之前設定。如果 size 引數小於工作目錄的路徑名,errno 會被設定為 ERANGE

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  if (getcwd(path, MAX_BUF) == NULL) {
    if (errno == ERANGE)
      printf("[ERROR] pathname length exceeds the buffer size\n");
    else
      perror("getcwd");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", path);

  exit(EXIT_SUCCESS);
}

另外,我們也可以將 NULL 值作為第一個引數傳遞給 getcwd 函式,0 作為第二個引數。函式本身會使用 malloc 動態分配一個足夠大的緩衝區,並返回指向該位置的 char 指標。注意,使用者應該在返回的指標上呼叫 free 函式來重新分配緩衝區記憶體。

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  char *buf = getcwd(NULL, 0);
  if (buf == NULL) {
    perror("getcwd");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", buf);
  free(buf);

  exit(EXIT_SUCCESS);
}

使用 get_current_dir_name 函式獲取當前工作目錄

get_current_dir_name 是另一個可以檢索當前工作目錄的函式。注意這個函式需要定義 _GNU_SOURCE 巨集,否則程式碼很可能會出現編譯錯誤。get_current_dir_name 不接受引數,返回 char 指標,類似於 getcwd 函式。記憶體是用 malloc 自動分配的,呼叫者的程式碼負責釋放返回的指標。

#define _GNU_SOURCE
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  char *buf = get_current_dir_name();
  if (buf == NULL) {
    perror("get_current_dir_name");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", buf);
  free(buf);

  exit(EXIT_SUCCESS);
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook