假设一个文件&文件夹确实存在,我想要一个函数来检查该文件是否包含在该文件夹中。
例如:/a/b
包含/a/b/c/d.e
,/a/b
包含/a/b/c.d
,/a/b
不包含/a/b/../c/d.e
。
我现在得到的是规范化路径,然后比较前缀部分。有什么干净简单的方法可以做到这一点吗?
只有在C++17中才有std::filesystem API具有这样的功能
对于早期的C++版本,您必须回退到boost或系统特定的库。
遗憾的是,std::filesystem::path没有直接方法,但这应该可以完成任务:
using std::filesystem::path;
path normalized_trimed(const path& p)
{
auto r = p.lexically_normal();
if (r.has_filename()) return r;
return r.parent_path();
}
bool is_subpath_of(const path& base, const path& sub)
{
auto b = normalized_trimed(base);
auto s = normalized_trimed(sub).parent_path();
auto m = std::mismatch(b.begin(), b.end(),
s.begin(), s.end());
return m.first == b.end();
}
现场演示
我假设文件路径如下:C: \Program Files\Important\data\app.exe而文件夹路径是这样的:C: \程序文件因此,你可能想试试这个代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string filePath, folderPath;
cout << "Insert the full file path along with its name" << endl;
getline(cin,filePath); //using getline since a path can have spaces
cout << "Insert the full file folder path" << endl;
getline(cin,folderPath);
if(filePath.find(folderPath) != string::npos)
{
cout << "yes";
}
else
{
cout << "yes";
}
return 0;
}