문제

C ++에서 프로그램을 작성하여 명령 줄의 인수로 파일 이름을 수락합니다.

>> ./myprogram ../path/to/file.txt

나는 단순히 FSTREAM을 사용하여 열 수 있다는 것을 알고 있습니다 argv[1], 그러나 프로그램은 파일의 정확한 위치 (예 : 전체 PathName)에 대한 자세한 정보가 필요합니다.

나는 부여에 대해 생각했다 argv[1] 에게 getcwd(), 그러나 위의 예에서 당신은 끝날 것입니다. /path/../path/to/file.txt. FSTREAM이 그 경로를 자동으로 해결할 것인지 확실하지 않지만, 그랬더라도 문자열 처리가 많지 않은 전체 경로가 없습니다.

물론, 제공된 경로가 이미 절대적이라면 그 방법은 전혀 작동하지 않을 것입니다. 이 프로그램은 Linux/Windows/etc에서 실행될 수 있으므로 시작 '/'문자를 감지하는 것은 인수가 전체 경로인지 여부를 결정하기 위해 작동하지 않습니다.

나는 이것이 여러 OSS의 경로 이름을 다루는 데 상당히 일반적인 문제라고 생각합니다. 그래서 명령 줄 인수의 전체 경로 이름을 어떻게 리테로화합니까? 그리고 이것이 운영 체제간에 어떻게 처리됩니까??

도움이 되었습니까?

해결책

PathName 처리는 매우 OS- 특이 적입니다. 일부 OS는 하나의 루트 (예 : UNIX)가있는 계층 구조를 가지고 있으며 일부는 LA MS-DOS의 드라이브 문자에 몇 개의 뿌리가 있습니다. 일부는 기호 링크, 하드 링크 또는 다른 종류의 링크를 가질 수 있으며, 이는 트래버스를 까다로울 수 있습니다. 일부는 파일에 대한 "표준"경로의 개념을 가지고 있지 않을 수도 있습니다 (예 : 파일에 하드 링크가있는 경우 여러 이름이 있고 그 중 어느 것도 더 "정식"이 아닙니다).

Java의 여러 OS를 가로 질러 경로 이름 조작을 시도한 적이 있다면 다음과 같은 의미를 알고 있습니다.

요컨대, PathName 처리는 시스템 별이므로 각 OS (가족)에 대해 별도로 수행하거나 적합한 라이브러리를 사용해야합니다.

편집하다:

당신은 볼 수 있습니다 아파치 휴대용 런타임, 또는 부스트 (C ++)에서는 둘 다 PathName 처리 기능이 있습니다.

다른 팁

.../spath/../path/to/file.txt로 끝납니다. FSTREAM이 그 경로를 자동으로 해결할 것인지 확실하지 않지만, 그랬더라도 문자열 처리가 많지 않은 전체 경로가 없습니다.

그것은 문제없이 원하는 모든 것을 위해/spat/../path/를 사용할 수 있습니다.

어쨌든 C ++에는 원하는 작업을 수행하는 표준 기능이 없습니다. 당신은 수동으로 그것을해야 할 것이고, 그것은 사소하지 않을 것입니다. 나는 당신이 길을 그대로 유지하는 것이 좋습니다. 어떤 문제가 발생하지 않아야합니다.

os 의존적입니다. Linux를 사용하는 경우 볼 수 있습니다 RealPath (). 의심 할 여지없이 Windows에는 비슷한 것이 있습니다.

afaik 표준 방법은 없습니다.

그러나이 접근법 (의사 코드로 작성)을 시도 할 수 있습니다.

string raw_dirname=get_directory_part(argv[1])
string basename=get_filename_part(argv[1])
string cwd=getcwd()
chdir(relative_dirname)
string absolute_dirname=getcwd()
chdir(cwd)
string absolute_filename=absulute_dirname + separator + basename

그러나 참고 : 상징적 링크가 발생할 때 문제가 있는지 확실하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top