파일 이름 (C : \ folder \ foo.txt)이 있고 관리되지 않는 C ++에서 폴더 이름 (C : \ folder)을 검색해야합니다. C #에서는 다음과 같이합니다.
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
관리되지 않는 C ++에서 파일 이름에서 경로를 추출하는 데 사용할 수있는 함수가 있습니까?
파일 이름 (C : \ folder \ foo.txt)이 있고 관리되지 않는 C ++에서 폴더 이름 (C : \ folder)을 검색해야합니다. C #에서는 다음과 같이합니다.
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
관리되지 않는 C ++에서 파일 이름에서 경로를 추출하는 데 사용할 수있는 함수가 있습니까?
답변:
이를위한 표준 Windows 함수 인 PathRemoveFileSpec이 있습니다. Windows 8 이상 만 지원하는 경우 대신 PathCchRemoveFileSpec 을 사용하는 것이 좋습니다 . 다른 개선 사항 중에서 더 이상 MAX_PATH
(260) 문자로 제한되지 않습니다 .
Boost.Filesystem 사용 :
boost::filesystem::path p("C:\\folder\\foo.txt");
boost::filesystem::path dir = p.parent_path();
parent_path()
from "C:\\folder"
이 "C:"
.
http://www.cplusplus.com/reference/string/string/find_last_of/의 예
// string::find_last_of
#include <iostream>
#include <string>
using namespace std;
void SplitFilename (const string& str)
{
size_t found;
cout << "Splitting: " << str << endl;
found=str.find_last_of("/\\");
cout << " folder: " << str.substr(0,found) << endl;
cout << " file: " << str.substr(found+1) << endl;
}
int main ()
{
string str1 ("/usr/bin/man");
string str2 ("c:\\windows\\winhelp.exe");
SplitFilename (str1);
SplitFilename (str2);
return 0;
}
C ++ 17에는 std::filesystem::path
메소드를 사용 하는 클래스가 있습니다 parent_path
.
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
for(fs::path p : {"/var/tmp/example.txt", "/", "/var/tmp/."})
std::cout << "The parent path of " << p
<< " is " << p.parent_path() << '\n';
}
가능한 출력 :
The parent path of "/var/tmp/example.txt" is "/var/tmp"
The parent path of "/" is ""
The parent path of "/var/tmp/." is "/var/tmp"
.remove_filename()
.
auto p = boost::filesystem::path("test/folder/file.txt");
std::cout << p.parent_path() << '\n'; // test/folder
std::cout << p.parent_path().filename() << '\n'; // folder
std::cout << p.filename() << '\n'; // file.txt
p.parent_path().filename()
상위 폴더의 이름을 가져와야 할 수 있습니다 .
boost :: filesystem을 사용합니다. 어쨌든 다음 표준에 통합되어 익숙해 질 수 있습니다.
_splitpath 는 좋은 CRT 솔루션입니다.
아무도 Posix에서 표준 방식을 언급하지 않은 것에 놀랐습니다.
basename / dirname
구문을 사용하십시오 .
man basename
basname(char * path)
아니라는 것을 의미합니다 basename(const char * path)
), 그렇게하지 않는 구현은 스레드를 안전하지 않게 만드는 정적 버퍼를 사용해야하는 것으로 보입니다 (원칙적으로 당신은 동적으로 할당 된 결과를 반환 할 수도 있지만 alloc
C ++에서는 어색한 패밀리 함수에 의존 하게됩니다.)
표준 C ++는 경로 이름이 플랫폼별로 다르기 때문에 이와 관련하여 많은 작업을 수행하지 않습니다. 수동으로 문자열을 구문 분석하거나 (glowcoder의 답변에서와 같이) 운영 체제 기능 (예 : http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx )을 사용하거나 가장 좋은 방법은 boost :: filesystem과 같은 타사 파일 시스템 라이브러리를 사용할 수 있다는 것입니다.
이것을 사용하십시오 : ExtractFilePath (your_path_file_name)