La seguente funzione dovrebbe determinare se un nome di file si trova da qualche parte all'interno della directory specificata, come figlio diretto o in qualche sottodirectory.
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());
}
Se si desidera solo per verificare se la directory è il padre immediato del file, quindi utilizzare questo invece:
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;
}
Si può anche essere interessati a the discussion about what "the same" means per quanto riguarda operator==
per i percorsi.
fonte
2013-03-21 14:13:14
Questa funzione dovrebbe vivere all'interno di Boost. Presumo che sia il tuo copyright, quindi posso chiederti quali sono le condizioni d'uso? Pubblico dominio, per favore? – vinipsmaker
@Vinipsmaker, i termini di utilizzo del mio codice sono gli stessi dei termini di utilizzo di tutto l'intero sistema Stack Exchange, che sono collegati dalla parte inferiore di ogni pagina: "Contributi utente concessi in licenza CC By-SA 3.0 con attribuzione necessario." –
Credo che questa funzione abbia un difetto che impedisce la sicurezza, si consideri '' path_contains_file ("folder1/folder2", "folder1/folder2 /../../ secretFolder/sectedFile.txt") '' Quindi se lo si utilizza per i controlli di accesso , potrebbero erroneamente passare. L'uso di '' filesystem :: canonical'' lo risolverebbe, ma solo per i file esistenti! – PhilLab