이 방법을 통해 전체 경로 및 파일 시스템 가능 입수합니다 플랫폼에 독립적 있을 수 있는 프로그램이 실행되고 디렉토리에는 사용하는 c/c++? 혼동하지 않도록 현재 작업 디렉터리입니다. (제발 don& # 39, t # 39 와 같은 표준 라이브러리 제안하세요 they& 않는 한, re 수준들과 clib 또는 STL.)
(만약 there& # 39, s no 플랫폼 / 파일 시스템 가능 방법을 사용할 수 있는 특정 파일 시스템은 windows 와 linux 를 제안 itopia 고쳐주렴.)
Windows:
int bytes = GetModuleFileName(NULL, pBuf, len);
if(bytes == 0)
return -1;
else
return bytes;
리눅스:
char szTmp[32];
sprintf(szTmp, "/proc/%d/exe", getpid());
int bytes = MIN(readlink(szTmp, pBuf, len), len - 1);
if(bytes >= 0)
pBuf[bytes] = '\0';
return bytes;
현재 디렉터리입니다 프로그램에 처음 시작될 때, 그러면 페치할 경우 해당 프로그램이 시작된 사실상 디렉토리에는 충스러웠으니. 변수에 값을 저장할 수 있으며, 나중에 프로그램의) 는 다음과 같은 뜻이 있다. 이는 구분되어 [디렉토리에는 현재 갖고 있는 프로그램 실행 파일] (https://stackoverflow.com/q/933850/33732). 이 같은 디렉터리입니다 반드시 isn& t # 39;; 누군가 명령 프롬프트에서 실행 중인 프로그램 실행 후 이 프로그램은 명령, s # 39 에서 prompt& 현재 작업 디렉터리 비록 프로그램 파일 다른 곳에서 살고 있다.
모든 사람이 POSIX 호환 플랫폼 (out of the box) 는 posix 함수 및 지원 제스우드. 아무것도 하지 않아도 됩니다 특수 (windows 에서 디르치스트 어니스트 d.흐 헤더를 니클라이딩 별도로 (Unix) 및 오른쪽).
이후 C c 런타임 라이브러리 연계 프로그램을 작성할 것이라고 기본값입니다 연결되어 있는 모든 프로세스를 통해 시스템 (특수한 것을 특별히 예외) 이 기능을 기본적으로 포함할 예정이다. Crt 는 절대 옵션이므로 때문에 외부 라이브러리에 표준 준수 인터페이스입니다 제공하는 기본 OS.
Windows 의 제스우드 설정되었습니다 은혜를 _getcwd 의 기능을 더 이상 사용되지 않습니다. 저는 이 방법으로 이를 사용할 수 있습니다.
#include <stdio.h> /* defines FILENAME_MAX */
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif
char cCurrentPath[FILENAME_MAX];
if (!GetCurrentDir(cCurrentPath, sizeof(cCurrentPath)))
{
return errno;
}
cCurrentPath[sizeof(cCurrentPath) - 1] = '\0'; /* not really required */
printf ("The current working directory is %s", cCurrentPath);
이것은 1 의 [케플러스플루스 포럼]
#include <string>
#include <windows.h>
std::string getexepath()
{
char result[ MAX_PATH ];
return std::string( result, GetModuleFileName( NULL, result, MAX_PATH ) );
}
#include <string>
#include <limits.h>
#include <unistd.h>
std::string getexepath()
{
char result[ PATH_MAX ];
ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
return std::string( result, (count > 0) ? count : 0 );
}
#include <string>
#include <limits.h>
#define _PSTAT64
#include <sys/pstat.h>
#include <sys/types.h>
#include <unistd.h>
std::string getexepath()
{
char result[ PATH_MAX ];
struct pst_status ps;
if (pstat_getproc( &ps, sizeof( ps ), 0, getpid() ) < 0)
return std::string();
if (pstat_getpathname( result, PATH_MAX, &ps.pst_fid_text ) < 0)
return std::string();
return std::string( result );
}
스케쳐내 라이브러리보다는 않고 표준 방법이다. 아니요, 전체 总监和首席信息官完全了解 디렉터리입니다 표준 포함되지 않습니다.
일부 (노트북) 의 경우 거의 표준 라이브러리 의존성을 그땅은 의견을 같이하고 있다. [Boost& # 39 의 파일 시스템 라이브러리] 사용하여 요청할 1 및 [initial_path ()] [2].
[2]: http://www.boost.org/doc/libs/1_36_0/libs/filesystem/doc/reference.html # initial_path
파일 시스템 TS [이제 표준] [1] (및 지원하는 mgcc 5.3+ 및 클랭 3.9+), 'current_path ()' 에서 사용할 수 있도록 기능을 제공합니다.
std::string path = std::experimental::filesystem::current_path();
Mgcc 포함할 수 있는 파일 시스템 (5.3+) 를 사용해야 합니다.
#include <experimental/filesystem>
및 링크 코드에 -lstdc++fs '와' 기.
스케쳐내 파일 시스템을 사용할 수 있는 Microsoft Visual Studio, 다음 [검토완료 이] (https://msdn.microsoft.com/en-us/library/hh874694).
[1]: http://www.iso.org/iso/catalogue_detail.htm = 63483 키스 움베르?
내가 안단말이야 따돌리기 위해 이날 현재 매우 늦은 답을 한 것처럼 나를 내 스스로 답을 찾을 수 있다 하지만 난 제공하지 않는다는 그렇고여 유용한 솔루션입니다. 매우 간단한 방법은 bin 폴더를 데이터베이스에구성원을 CWD 는 다음과 같은 경로를 얻을 수 있습니다.
int main(int argc, char* argv[])
{
std::string argv_str(argv[0]);
std::string base = argv_str.substr(0, argv_str.find_last_of("/"));
}
이제 이 기준으로 상대 경로를 단축시킵니다 됩니다. 예를 들어 나는 이 디렉토리에는 구조:
main
----> test
----> src
----> bin
내가 내 소스 코드를 컴파일 할 수 있는데 이 선을 테스트하려면 용지함 및 쓰기 로그에서는 추가하기만 내 코드.
std::string pathToWrite = base + "/../test/test.log";
나도 날잡아 Linux 에서 전체 경로를 등이 이 방식을 사용하여 앨리어스가 작동하잖아 그냥 그랬다고.
참고:
std::string base = argv[0].substr(0, argv[0].find_last_of("\\"));
그러나 haven& # 39 이 노력해야 할 것 같아요, t 테스트되었습니다 도왔으매 주석문입니다 작동하잖아 또는 수리입니다 약간만이라도 평가받을 경우 만약 그렇지 않다면.
아니, there& # 39 의 표준 방법이 없습니다. 내가 갖고 있는 것으로 C/C++ 표준을 don& # 39, 디렉토리 (또는 다른 파일 시스템 조직) 의 존재를 고려해보십시오 못할 정도였습니다.
Windows 에서 제모두리피렌임 전체 경로를 반환되므로 실행 파일 () 로 설정할 때 현재 프로세스를 모두리 파라메트가 nulll. 내가 can& # 39, Linux 와 t help.
또한, strike> < 현재 디렉터리 또는 디렉토리에는 복사할지 구체화합니다 합니다, 프로그램 이미지 / 실행 할 수 있습니다. 이 때문에 는 질문 좀 모호해 point.< /strike>;
아마 연결 현재 작업 디렉토리에 있는 argv [0]? # 39 m 확신하지 못하고 있지만, 이렇게 될 경우 i& 작업하십시오 windo 작동하잖아 linux 에서.
예를 들면 다음과 같습니다.
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv) {
char the_path[256];
getcwd(the_path, 255);
strcat(the_path, "/");
strcat(the_path, argv[0]);
printf("%s\n", the_path);
return 0;
}
이 때, 실행하십시오 출력입니다:
>. $ ./test ~ / 데스크탑입니다 jeremy@jeremy-desktop: >. /home/jeremy/Desktop/./test
[제커랑드리스토리] [1] 는 Win32 용 어떻게해야합니다 의심하게 된다.
[1]: 이아스파스 http://msdn.microsoft.com/en-us/library/aa364934 (VS.85)
가장 간단한 방법은 '에서' 기능은 Windows 에서 사용할 수 있는 '' 스테드리발트 _get_pgmptr 포인터입니다 문자열으로 seabreeze 절대 경로 등 실행 파일을 실행 파일 이름.
char* path;
_get_pgmptr(&path);
printf(path); // Example output: C:/Projects/Hello/World.exe
Windows 용 시스템 ('방향') 함장님이요 콘솔에 시스템을 사용할 수 있습니다. · 콘솔 등 디렉토리이며 대한 정보를 제공합니다. Dir 명령 '이' 검토완료 http://support. 'cmd'. 하지만, 나는 # 39, 유닉스 계열 운영 체제에서는 don& 수 있을지 알 수 없다. 이 명령을 실행할 경우 읽기 bash 함장님이요 'ls' 표시되지 않습니다 디렉터리입니다.
예:
int main()
{
system("dir");
system("pause"); //this wait for Enter-key-press;
return 0;
}
그냥 여기 있는 뒤늦게나마 뭉치.
기본 파일 시스템 때문에 의존하지 않는 언어는 표준 솔루션 없다고 답한 사람이 되도록 总监和首席信息官完全了解 디렉터리입니다 c / c++ 언어 기반의 파일 시스템이 범위를 벗어납니다.
여기에 현재 작업 디렉토리에 있는 것이 아니라 운영까지도 디렉토리에는 고려해야 하는 프로그램이 실행되는 프로그램을 어떻게 잡을라는데 곳으로 - ie 로 새로운 프로세스를 통해 생성된 알렸어 포크하지, etc. 프로그램은 실행 중인 afaq 디렉토리에는 매치-온-토큰기술을 시연, 해당 정보를 이용할 수 있게 하는 등 솔루션 프로세스 제어 구조를 통해 운영 체제, 이는 이 문제가 있는 유일한 권위를 질문이예요 따라서 정의에 따라 특화된 솔루션을 자체 OS 를.
#include <windows.h>
using namespace std;
// The directory path returned by native GetCurrentDirectory() no end backslash
string getCurrentDirectoryOnWindows()
{
const unsigned long maxDir = 260;
char currentDir[maxDir];
GetCurrentDirectory(maxDir, currentDir);
return string(currentDir);
}
Linux bash 명령
심지어 어떤 명령을 내릴 수 있는 경우 해당 프로그램 및 임시 파일 및 프로그램 내에서 직접 결과를 그 이후에 판독합니다 임시 파일, 해당 프로그램 실행 중 하나는 있는지 여부는 표시되지 않습니다. 그 이름을 가진 프로그램을 통해 뿐입니다 어디에 위치해 있다.
요구됩니다 구하려면 아웃해야 프로세스 id 번호 및 경로 이름과 구문 분석
내 프로그램을 다운로드되었는지 프로그램 'I want to
호출하든 / usr / bin. /usr/bin 지원 대상 버전에 포함될 예정이라고 말했다. 제 생각으로는 에로남이네 이동형이든지 Linux 에서 하나의 솔루션으로 문제가 있다.
Say you have a path 다음과 같습니다.
"path/to/file/folder"
어떤 이유로든 linix 구축됨 실행 파일 (made in 대체하십시오 eclipse 작동합니다. 그러나 이 같은 경우 매우 혼란스럽다 windows 가 주어진 경로를 작동합니까!
위에 언급된 바와 같이 여러 가지 방법으로 받을 수 있는 가장 쉬운 방법은 실행 파일의 경로를 찾을 수 있지만, 현재 대부분의 경우가 작동됨 매력은 이 추가 전면의 경로:
"./path/to/file/folder"
그냥 " 추가 ./"; 정렬할지 얻어야 할 수 있습니다! ) 따라서 이는 에서 로드을 시작할 수 있습니다 다음 있는모든 디렉터리입니다 프로파일링하려는 실행가능파일 함께 할 수 있다.
편집: # 39 이 won& 시도할 경우, t, s # 39 에서 실행 가능한 작동합니까 실행하십시오 코드 블록 that& 사용되는 경우, 이 개발 환경 등 몇 가지 이유로, 코드 블록 doesn& 로드하십시오 그러겄지 물건을 t # 39. D
EDIT2: 나는 몇 가지 새로운 것을 발견한 것은 이와 같은 코드에서 고정된 경로를 지정할 경우 (단 에스타 플레스트라다 필요한 일이 바로 로드하기에):
"resources/Example.data"
그런 다음 실제 디렉터리입니다 app 에서 실행할 수 있습니다 () 또는 (Windows), dir, dir 단축 및 설정할 수 있게 apc® 데이터베이스에구성원을 app) 을 사용하는 것과 같은 것이라고 확신한다. 이 때는 렉시한테서 디버깅하지 관련된 문제를 누각되었습니다 리소스에는 / 파일 경로를. (특히 ide 에서 exe 구축하십시오 작업 디렉터리 시작할 때 잘못 설정한 IDE)
참고로 이 같은 결과를 얻을 수 있습니다 '또는' /foo/bar//baz/a.out /foo/bar/././baz/a.out 예쁜 너회가 것만은 아니다 '' 결과, 하지만 난 항상 유효한 경로를 이름을 믿고 있는 실행가능파일 참고로 연속적입니다 슬래시를 축소되어 패스를 한).
저는 이전에 렌프프 이용하여 솔루션을 '이란' (세 번째 인수를 '주 ()' 이 협력했습니다 리눅스 기반으로 하지만 didn& # 39, t 듯한 작업 Windows 의 도왔으매 I& # 39, m 본질적으로 추천할 동일한 솔루션으로 다른 사람이 아니하였으매 이전에 갖추고 있지만, 추가 설명 중 올바른 것은 실제로 경우에도 그 결과는 아주.
, 미노크 언급한 대로 해당 기능이 없는 지정된 ini C 표준 또는 C++ 표준. 이는 순수하게 운영체제별 피쳐이고 것으로, 예를 들어 POSIX 표준 지정해야 합니다.
좋은 대안이 꼭 이래야겠어요 추천합니까 100% 는 취합은 헤더도 국한됨 [스트라소프트 c++컴파일러는 라이브러리보다는] [1] [매튜 윌슨] [2] () 의 저자 대한 책도 읽을 수 있어야합니다 c++컴파일러는). 파사드 판포르메스틀 시스템-특정 apiu 좁히어 가 이동형이든지 액세스할 수 있습니다. Unix 에서 Windows 및 우닉스틀 윈스틀 있기 때문에 이동형이든지 솔루션입니다. 모든 시스템-특정 요소가 함께 사용할 수 있기 때문에, 정책, 지정된 모든 확장 레임워크. 물론 제공하는 파일 시스템 라이브러리 있습니다.
[1]: http://en.wikipedia.org/wiki/STLSoft_C% 2b% 2b_libraries [2]: http://en.wikipedia.org/wiki/Matthew_Wilson_% 28author% 29
C++11 수행됨 사용하여 파일 시스템, C++14-C++17 아니라 실험적인 시작으로 공식 사용하여 파일 시스템.
아프리카시옹스트:
#pragma once
//
// https://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros
//
#ifdef __cpp_lib_filesystem
#include <filesystem>
#else
#include <experimental/filesystem>
namespace std {
namespace filesystem = experimental::filesystem;
}
#endif
std::filesystem::path getexepath();
아프리카션스코프:
#include "application.h"
#ifdef _WIN32
#include <windows.h> //GetModuleFileNameW
#else
#include <limits.h>
#include <unistd.h> //readlink
#endif
std::filesystem::path getexepath()
{
#ifdef _WIN32
wchar_t path[MAX_PATH] = { 0 };
GetModuleFileNameW(NULL, path, MAX_PATH);
return path;
#else
char result[PATH_MAX];
ssize_t count = readlink("/proc/self/exe", result, PATH_MAX);
return std::string(result, (count > 0) ? count : 0);
#endif
}