2013-03-21 22 views
10

Come determinare se il file è contenuto dal percorso con boost file system v3.come determinare se il file è contenuto dal percorso con boost filesystem v3

Ho visto che c'è un operatore minore o maggiore ma questo sembra essere solo lessicale. Il modo migliore che ho visto è stata la seguente:

  • prendere i due percorsi assoluti del file e il percorso
  • Rimuovere l'ultima parte del file e vedere se è uguale al percorso (se lo fa è contenuta)

C'è un modo migliore per farlo?

risposta

12

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.

+0

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

+0

@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." –

+1

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

Problemi correlati