Как проверить, содержится ли файл в папке с C ++? - PullRequest
0 голосов
/ 04 марта 2020

Если файл и папка существуют, я хочу, чтобы функция проверяла, содержится ли файл в папке.

Например: /a/b содержит /a/b/c/d.e, /a/b содержит /a/b/c.d, /a/b не содержит /a/b/../c/d.e.

Теперь я должен нормализовать путь, а затем сравнить префиксную часть. Есть ли какой-нибудь простой и понятный способ сделать это?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Только из C ++ 17 там std :: filesystem API, который имеет такую ​​возможность.
Для более ранней версии C ++ вам нужно вернуться к boost или системной спецификации c библиотека.

К сожалению 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();
}

Живая демоверсия

1 голос
/ 04 марта 2020

Я буду считать, что путь к файлу примерно такой: C: \ Program Files \ Important \ data \ app.exe, а путь к папке примерно такой: C: \ Program Files И так для этого Вы можете попробовать этот код:

#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;
}
...