2013-08-03 15 views
10

Mam program, który pobiera ścieżkę folderu jako argument wiersza poleceń. A potem łączę to z nazwami plików, aby uzyskać dostęp do tych plików.Czy istnieje idiom do dodawania końcowego ukośnika do ścieżki pliku?

Na przykład FOLDER_PATH jest „./config/” a następnie ścieżka_do_pliku byłoby „./config/app.conf” jak pokazano poniżej

stringstream ss; 
ss << folder_path << "app.conf"; 
file_path = ss.str(); 

Ale to nie będzie działać, jeśli FOLDER_PATH robi” t zawierać zakończenie końcowe. Wydaje się, że jest to typowy problem, więc zastanawiałem się, czy istnieje idiom dodawania slasha na końcu, jeśli nie istnieje.

+1

Nie znam żadnego idiomu, ale myślę, że korzystanie z biblioteki takiej jak system plików doładowania jest o wiele bardziej elastyczne, nie musisz się martwić ukośnikami i ukośnikami (Windows). Dalej ta biblioteka będzie częścią standardowej biblioteki. – dieram3

Odpowiedz

11

I zazwyczaj to zrobić, jeśli ścieżka jest w std :: string o nazwie ścieżki:

if (!pathname.empty() && *pathname.rbegin() != '/') 
    pathname += '/'; 

Lub z basic_string :: tyłu():

if (!pathname.empty() && pathname.back() != '/') 
    pathname += '/'; 

dodać sprawę do ukośnik odwrotny, jeśli to konieczne.

Dodano: Należy również pamiętać, że * nix będzie obsługiwać kolejne ukośniki w nazwach ścieżek jako pojedynczy ukośnik. W wielu sytuacjach wystarczy dodać slash bez sprawdzania.

2

Linux nie dba o to, czy masz dodatkowe ukośniki, więc/home/user/hello i/home/user // hello są w tej samej lokalizacji. Możesz dodać ukośnik jako bezpieczny. Lub możesz to sprawdzić, zaznaczając ostatni znak.

0

Stosując C 14/C++ ++ 17 std::filesystem:

#include <experimental/filesystem> // C++14. 
namespace fs = std::experimental::filesystem; // C++14. 
//#include <filesystem> // C++17. 
//namespace fs = std::filesystem; // C++17. 

void addTrailingDelimiter(fs::path& path) { 
    if (!path.empty() && path.generic_string().back() != '/') 
     path += '/'; 
} 

zwrócić uwagę na zachowanie fs::path::generic_string(). W ten sposób nie musisz sprawdzać pod kątem native path delimiters (natywna wersja WinAPI! = Generic, podczas gdy Posix native = generic).

Możesz pominąć if (path.generic_string().back() != '/'), ponieważ Posix i WinAPI nie dbają o kilka kolejnych ograniczników ścieżki.

Powiązane problemy