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


162

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

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

Answers:


291

你看了getcwd()吗?

#include <unistd.h>
char *getcwd(char *buf, size_t size);

简单的例子:

#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;
}

11
选择最挑剔的单元格,<errno.h>似乎是不必要的,该程序甚至会通过退出状态报告成功。否则,是一个很好的例子。
乔纳森·莱夫勒

21
哦,用printf(...)代替fprintf(stdout,...)是否更常规?
乔纳森·莱夫勒

19
@JonathanLeffler:那不是最挑剔的尼特。这是:int main()应该是int main(void)
基思·汤普森

4
如果栈上的〜4KB不是问题,我将使用limits.h中的PATH_MAX而不是幻数。
jacekmigacz

1
仍然不存在,您的缓冲区还应该容纳字符串终止字节/空值,因此正确的是char cwd[PATH_MAX+1]。或者,如果您不能仅char *buf=getcwd(NULL,0);在完成时就被缓冲区打扰free(buf)(自POSIX.1-2001起)
bliako

60

查找手册页getcwd


7
@angad教一个人钓鱼,但至少要带他去湖/海/海洋的路径:)
mtk 2015年

3
人们向尝试使用Google优越的搜索方法的人推荐男人的想法与世隔绝。
gbtimmon '16

3
代码段:man 3 getcwd。除了开玩笑,别太过古板,这篇文章来自08年,所以惯例不一样。
Kroltan

2
@gbtimmon google是搜索引擎,它与手册页不相似。最终它将指向手册页。
Ajay Brahmakshatriya

24

尽管该问题标记为Unix,但当目标平台是Windows时,人们也会访问它,而Windows的答案是该GetCurrentDirectory()函数:

DWORD WINAPI GetCurrentDirectory(
  _In_  DWORD  nBufferLength,
  _Out_ LPTSTR lpBuffer
);

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

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


2
#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;
}

3
为什么不使用预定义的宏来检测操作系统,例如#if defined(_WIN32)|| 已定义(_WIN64)|| 定义(WINDOWS
HaSeeB MiR '18

1

请注意,这getcwd(3)在Microsoft的libc中也可以使用:getcwd(3),并且以您期望的方式工作。

必须与-loldnames(oldnames.lib,大多数情况下会自动完成)链接,或使用_getcwd()。未前缀版本在Windows RT下不可用。


0

要获取当前目录(执行目标程序的位置),可以使用以下示例代码,该示例代码对Visual Studio和Linux / MacOS(gcc / clang)(适用于C和C ++)均适用:

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

#if defined(_MSC_VER)
#include <direct.h>
#define getcwd _getcwd
#elif defined(__GNUC__)
#include <unistd.h>
#endif

int main() {
    char* buffer;

    if( (buffer=getcwd(NULL, 0)) == NULL) {
        perror("failed to get current directory\n");
    } else {
        printf("%s \nLength: %zu\n", buffer, strlen(buffer));
        free(buffer);
    }

    return 0;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.