Як отримати поточний каталог у програмі C?


162

Я роблю програму C, де мені потрібно отримати каталог, з якого програма запускається. Ця програма призначена для комп'ютерів UNIX. Я дивився на opendir()і telldir(), але telldir()повертає off_t (long int), так що це дійсно не допомагає мені.

Як я можу отримати поточний шлях у рядку (масив char)?

Відповіді:


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
Я б використовував PATH_MAX з limit.h, а не магічне число, якщо ~ 4 КБ на стеці не є проблемою.
jacekmigacz

1
Ще там немає, ваш буфер також повинен містити байт / null завершення рядка, тому правильний char cwd[PATH_MAX+1]. Або якщо вас не можуть турбувати буфери просто char *buf=getcwd(NULL,0);та коли ви закінчите free(buf)(станом на POSIX.1-2001)
bliako

60

Перегляньте сторінку чоловіка getcwd.


7
@angad навчить людину ловити рибу, але принаймні покажіть йому шлях до озера / моря / океану :)
mtk

3
люди, які рекомендують людину людям, які намагаються використовувати надзвичайно чудовий метод пошуку google, не торкаються.
gbtimmon

3
Фрагмент коду: man 3 getcwd. Жарти вбік, не будьте анархоністичними, це повідомлення від '08 року, тому конвенції були іншими.
Кролтан

2
@gbtimmon google - це пошукова система, вона не є аналогом сторінки man. Врешті-решт, це вкаже на сторінку людини.
Аджай Брахмакшатрія

24

Хоча питання позначене Unix, люди також відвідують його, коли їх цільовою платформою є Windows, а відповідь для Windows - це GetCurrentDirectory()функція:

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

Ці відповіді стосуються і C, і C ++ коду.

Посилання запропонував user4581301 в коментар на інше питання, і перевірити як поточний кращий вибір з пошукової «сайту: microsoft.com GetCurrentDirectory» Google.


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 визначено (_WIN32) || визначено (_WIN64) || визначено ( WINDOWS )
HaseeB Mir

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.