c++ 如何从路径字符串中删除文件名

问题描述 投票:0回答:6

我有

const char *pathname = "..\somepath\somemorepath\somefile.ext";

如何将其转化为

"..\somepath\somemorepath"

c++ string filesystems
6个回答
63
投票

最简单的方法是使用 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;

此解决方案适用于正斜杠和反斜杠。


10
投票

在 Windows 上使用

_splitpath()
,在 Linux 上使用
dirname()


7
投票

在 Windows 8 上,使用

PathCchRemoveFileSpec
,可以在
Pathcch.h

中找到

PathCchRemoveFileSpec
将删除路径中的最后一个元素,因此如果您向其传递目录路径,最后一个文件夹将被删除。
如果您想避免这种情况,并且不确定文件路径是否是目录,请使用
PathIsDirectory

PathCchRemoveFileSpec
在包含正斜杠的路径上的行为不符合预期。


3
投票

使用

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
}

3
投票

假设你可以访问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 执行相同的操作。

使用这些库之一的优点是兼容多个操作系统。


0
投票

PathRemoveFileSpec(...) 为此,您不需要 Windows 8。 您需要包含 Shlwapi.h 和 Shlwapi.lib 但它们是 winapi 所以你不需要任何特殊的 SDK

© www.soinside.com 2019 - 2024. All rights reserved.