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>는 불필요 해 보이며 프로그램은 종료 상태를 통해 실패하더라도 성공을보고합니다. 그렇지 않으면 좋은 예입니다.
Jonathan Leffler

21
아, 그리고 fprintf (stdout, ...) 대신 printf (...)를 사용하는 것이 더 일반적입니까?
Jonathan Leffler

19
@JonathanLeffler : 그것은 니트 중에서 가장 까다로운 것이 아닙니다. 이것은 int main()이어야한다 int main(void).
Keith Thompson

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는 사람에게 물고기를 가르치지 만 atleast는 그에게 호수 / 바다 / 바다로가는 길을 보여줍니다 :)
mtk

3
Google은 매우 우수한 검색 방법을 사용하려는 사람들에게 사람을 추천하는 사람들은 연락이 없습니다.
gbtimmon

3
코드 스 니펫 : man 3 getcwd. 농담은 제쳐두고, 무정부 상태가되어서는 안된다.이 포스트는 '08 년부터 발간되었다.
Kroltan

2
@gbtimmon google은 검색 엔진이며 매뉴얼 페이지와 유사하지 않습니다. 결국 맨 페이지를 가리킬 것입니다.
Ajay Brahmakshatriya

24

질문에 유닉스 태그가 붙어 있지만 대상 플랫폼이 Windows 일 때 사람들이 방문하여 Windows에 대한 답이 GetCurrentDirectory()함수입니다.

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

이 답변은 C 및 C ++ 코드 모두에 적용됩니다.

user4581301 이 다른 질문 에 대한 의견 으로 제안한 링크를 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) 같은 OS를 탐지하기 위해 미리 정의 된 매크로를 사용하지 않는 이유 _ 정의 됨 (_WIN64) || defined ( WINDOWS )
HaseeB Mir

1

참고 getcwd(3)또한 마이크로 소프트의 libc의로 볼 수 있습니다 : (3)에 getcwd , 당신이 기대하는 것과 동일한 방식으로 작동합니다.

-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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.