Następująca funkcja powinna określać, czy nazwa pliku znajduje się gdzieś w podanym katalogu, jako bezpośrednie dziecko lub w jakimś podkatalogu.
bool path_contains_file(path dir, path file)
{
// If dir ends with "/" and isn't the root directory, then the final
// component returned by iterators will include "." and will interfere
// with the std::equal check below, so we strip it before proceeding.
if (dir.filename() == ".")
dir.remove_filename();
// We're also not interested in the file's name.
assert(file.has_filename());
file.remove_filename();
// If dir has more components than file, then file can't possibly
// reside in dir.
auto dir_len = std::distance(dir.begin(), dir.end());
auto file_len = std::distance(file.begin(), file.end());
if (dir_len > file_len)
return false;
// This stops checking when it reaches dir.end(), so it's OK if file
// has more directory components afterward. They won't be checked.
return std::equal(dir.begin(), dir.end(), file.begin());
}
Jeśli chcesz po prostu sprawdzić, czy katalog jest bezpośrednim rodzicem pliku, a następnie użyć tego zamiast:
bool path_directly_contains_file(path dir, path file)
{
if (dir.filename() == ".")
dir.remove_filename();
assert(file.has_filename());
file.remove_filename();
return dir == file;
}
Możesz być także zainteresowany the discussion about what "the same" means w odniesieniu do operator==
ścieżek.
Ta funkcja powinna działać w trybie zwiększenia. Zakładam, że to twoje prawa autorskie, to czy mogę zapytać, jakie są warunki użytkowania? Domena publiczna, proszę? – vinipsmaker
@Vinipsmaker, warunki korzystania z mojego kodu są takie same, jak warunki użytkowania dla całej sieci Stack Exchange, które są linkowane od dołu każdej strony: "Wkład użytkownika na licencji CC By-SA 3.0 z atrybucją wymagany." –
Wierzę, że ta funkcja ma wadę utrudniającą bezpieczeństwo, rozważ "path_contains_file (" folder1/folder2 "," folder1/folder2 /../../ secretFolder/sectedFile.txt ")' 'Więc jeśli użyjesz go do kontroli dostępu mogą niesłusznie przejść. Użycie '' filesystem :: canonical'' naprawiłoby to, ale tylko dla istniejących plików! – PhilLab