我在linux中使用c++,我想从c++ 14的路径中提取父文件夹。
例如,我有像
这样的路径/home/abc/fi.mp4
我的期望输出是abc
。如何在c++中实现
这是我做的
std::string getFolderName(const std::string &path) {
size_t found = path.find_last_of("/\");
string foldername = ...
return foldername;
}
我相信std::filesystem
的experimental
版本已经在c++ 14中可用了.
如果它在您的环境中确实可用,您可以使用parent_path()
从path
获取父文件夹。然后,您可以使用filename()
方法来提取没有完整路径规范的名称。
要将path
转换为std::string
,可以使用string()
方法。
#include <string>
#include <iostream>
#include <experimental/filesystem>
int main(int argc, char const* argv[])
{
std::string path_str = "/home/abc/fi.mp4";
std::experimental::filesystem::path p = path_str;
std::experimental::filesystem::path parent_p = p.parent_path();
std::experimental::filesystem::path parent_p_fname = p.parent_path().filename();
std::string result_str = parent_p_fname.string();
std::cout << result_str << std::endl;
return 0;
}
输出:
abc
您可以进一步使用parent_path()
来爬上层次结构。
experimental
前缀。
您可能想要这样的内容:
// Returns the path-string without the filename part
std::string getFolderPath(const std::string &path) {
const size_t found = path.find_last_of("/\");
return (found == string::npos) ? path : path.substr(0, found);
}
// Returns only the filename part (after the last slash)
std::string getFileName(const std::string & path) {
const size_t found = path.find_last_of("/\");
return (found == string::npos) ? path : path.substr(found+1);
}
getFolders函数将获得路径中所有文件夹的名称。
#include <vector>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
vector<string> getFolders(const char* path) {
vector<string> folders;
stringstream ss;
int i = 0, k = 0;
char c;
while ((c = *(path + i)) != ' ') {
if (c != '/'){
ss << c;
++k;
}
else {
if (k > 0){
folders.push_back(ss.str());
ss.str(string());
k = 0;
}
}
++i;
}
return folders;
}
void main()
{
vector<string> folders = getFolders("/home/abc/fi.mp4");
for (auto f : folders){
cout << f << endl;
}
}