2013-03-21 6 views
10

Jak ustalić, czy plik jest zawarty w ścieżce z systemem plików doładowania v3.jak ustalić, czy plik jest zawarty w ścieżce z systemem plików doładowania v3

Zobaczyłem, że istnieje mniejszy lub większy operator, ale wydaje się to być tylko leksykalne. Najlepszym sposobem widziałem był następujący:

  • Weźmy dwa bezwzględne ścieżki pliku i ścieżki
  • Usuń ostatnią część pliku i sprawdzić, czy jest równa ścieżkę (jeśli to robi to zawarte)

Czy istnieje lepszy sposób to zrobić?

Odpowiedz

12

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.

+0

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

+0

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

+1

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

Powiązane problemy