Как получить текущий каталог в программе на C? - PullRequest
146 голосов
/ 18 ноября 2008

Я делаю программу на C, где мне нужно получить каталог, из которого она запущена. Эта программа написана для компьютеров UNIX. Я смотрел на opendir() и telldir(), но telldir() возвращает off_t (long int), так что это действительно мне не помогает.

Как мне получить текущий путь в строке (массив символов)?

Ответы [ 5 ]

267 голосов
/ 18 ноября 2008

Вы смотрели на 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;
}
60 голосов
/ 18 ноября 2008

Просмотрите справочную страницу для getcwd.

17 голосов
/ 18 июля 2015

Несмотря на то, что вопрос помечен Unix, люди также посещают его, когда их целевой платформой является Windows, и ответом для Windows является функция GetCurrentDirectory():

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

Эти ответы применимы как к С, так и к С ++ коду.

Ссылка, предложенная user4581301 в комментарии на другой вопрос и подтверждена в качестве текущего лучшего варианта поиска с помощью поиска на сайте "microsoft.com getcurrentdirectory".

2 голосов
/ 19 декабря 2017
#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;
}
1 голос
/ 23 октября 2017

Обратите внимание, что getcwd(3) также доступен в libc от Microsoft: getcwd (3) и работает так же, как вы ожидаете.

Необходимо связать с -loldnames (oldnames.lib, что в большинстве случаев выполняется автоматически) или использовать _getcwd(). Версия без префикса недоступна в Windows RT.

...