如何在C程序中获取当前目录?

157 c unix working-directory

我正在制作一个C程序,我需要从中获取程序启动的目录.该程序是为UNIX计算机编写的.我一直在寻找opendir()telldir(),但telldir()返回off_t (long int),所以它确实没有帮助我.

如何在字符串(char数组)中获取当前路径?

Mic*_*Mic 282

你看过了getcwd()吗?

#include <unistd.h>
char *getcwd(char *buf, size_t size);
Run Code Online (Sandbox Code Playgroud)

简单的例子:

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

int main() {
   char cwd[PATH_MAX];
   if (getcwd(cwd, sizeof(cwd)) != NULL) {
       printf("Current working dir: %s\n", cwd);
   } else {
       perror("getcwd() error");
       return 1;
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,使用printf(...)代替fprintf(stdout,...)更常规吗? (21认同)
  • @JonathanLeffler:那不是最挑剔的尼特.这是:`int main()`应该是`int main(void)`. (17认同)
  • 挑选最挑剔的尼特,<errno.h>似乎是不必要的,程序即使在失败时也会通过退出状态报告成功.否则,一个很好的例子. (11认同)
  • 如果堆栈上的~4KB不是问题,我会使用limits.h中的PATH_MAX而不是幻数. (4认同)
  • 仍然不存在,您的缓冲区还应该容纳字符串终止字节/空,因此正确的缓冲区是 ``char cwd[PATH_MAX+1]```。或者,如果您不介意缓冲区,只需 ``char *buf=getcwd(NULL,0);``` ,当您完成后 ```free(buf)``` (从 POSIX.1- 2001) (4认同)

CAd*_*ker 58

查找手册页getcwd.

  • 最好还包括示例代码段. (13认同)
  • @angad教一个人捕鱼,但至少显示他通往湖泊/海洋的路径:) (5认同)
  • 人们向试图使用极其优越的搜索方法谷歌的人推荐男人是脱节的. (3认同)
  • 代码片段:`man 3 getcwd`.抛开笑话,不要无政府主义,这篇文章来自'08,SO约定不同. (3认同)
  • @gbtimmon google 是一个搜索引擎,它与手册页不同。它最终将指向手册页。 (2认同)

Jon*_*ler 19

虽然问题是标记为Unix,但是当他们的目标平台是Windows时,人们也可以访问它,而Windows的答案就是GetCurrentDirectory()功能:

DWORD WINAPI GetCurrentDirectory(
  _In_  DWORD  nBufferLength,
  _Out_ LPTSTR lpBuffer
);
Run Code Online (Sandbox Code Playgroud)

这些答案适用于C和C++代码.

用户4581301在对另一个问题的评论中建议的链接,并通过Google搜索"site:microsoft.com getcurrentdirectory"验证为当前的首选.

  • 即使问题询问的是 UNIX,这也可能是 Google 上的最佳答案,并且显然对于被误导的访问者仍然有用。 (2认同)

Jev*_*nov 5

#include <stdio.h>  /* defines FILENAME_MAX */
//#define WINDOWS  /* uncomment this line to use it for windows.*/
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

int main(){
  char buff[FILENAME_MAX];
  GetCurrentDir( buff, FILENAME_MAX );
  printf("Current working dir: %s\n", buff);
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用预定义的宏来检测操作系统,例如 #if Defined(_WIN32) || 定义(_WIN64) || 定义(__WINDOWS__) (5认同)