我有
const char *pathname = "..\somepath\somemorepath\somefile.ext";
如何将其转化为
"..\somepath\somemorepath"
?
最简单的方法是使用 find_last_of
std::string
成员函数
string s1("../somepath/somemorepath/somefile.ext");
string s2("..\\somepath\\somemorepath\\somefile.ext");
cout << s1.substr(0, s1.find_last_of("\\/")) << endl;
cout << s2.substr(0, s2.find_last_of("\\/")) << endl;
此解决方案适用于正斜杠和反斜杠。
PathCchRemoveFileSpec
,可以在 Pathcch.h
中找到
PathCchRemoveFileSpec
将删除路径中的最后一个元素,因此如果您向其传递目录路径,最后一个文件夹将被删除。PathIsDirectory
PathCchRemoveFileSpec
在包含正斜杠的路径上的行为不符合预期。
使用
strrchr()
找到最后一个反斜杠并删除字符串。
char *pos = strrchr(pathname, '\\');
if (pos != NULL) {
*pos = '\0'; //this will put the null terminator here. you can also copy to another string if you want
}
假设你可以访问c++17,它应该是这样的:
std::filesystem::path fullpath(path_string);
// `remove_filename()` does not alter `fullpath`
auto path_without_filename = fullpath.remove_filename();
std::cout << path_without_filename.string();
如果您没有 c++17,但可以访问 boost,则可以使用 boost::filesystem::path 执行相同的操作。
使用这些库之一的优点是兼容多个操作系统。
PathRemoveFileSpec(...) 为此,您不需要 Windows 8。 您需要包含 Shlwapi.h 和 Shlwapi.lib 但它们是 winapi 所以你不需要任何特殊的 SDK