2013-08-03 7 views
10

Ho un programma che accetta un percorso di cartella come argomento della riga di comando. E poi concatenare quello con i nomi dei file per accedere a quei file.Esiste un modo per aggiungere una barra finale a un percorso file?

Per esempio, folder_path è "./config/" e poi file_path sarebbe "./config/app.conf" come mostrato di seguito

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

Ma questo non avrebbe funzionato se folder_path doesn' t contenere una barra finale. Sembra un problema comune, quindi mi chiedevo se c'è un idioma per aggiungere la barra alla fine, se non esiste.

+1

Non conosco alcun idioma, ma penso che utilizzare una libreria come boost filesystem sia molto più flessibile, non devi preoccuparti di barre o barre retroverse (Windows). Inoltre questa libreria farà parte della libreria standard. – dieram3

risposta

11

solito faccio questo, se il percorso è in una std :: string nome percorso:

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

Oppure, con basic_string :: back():

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

Aggiungi un caso per backslash se necessario.

Aggiunto: Si noti inoltre che * nix gestirà le barre consecutive nei nomi dei percorsi come una singola barra. Quindi in molte situazioni, è sufficiente aggiungere sempre una barra senza controllo.

2

A Linux non interessa se si dispone di una barra in più, quindi/home/utente/ciao e/home/utente // ciao sono la stessa posizione. È possibile aggiungere la barra come sicura. Oppure, puoi verificarlo controllando l'ultimo carattere.

0

Uso 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 += '/'; 
} 

Heed il fs::path::generic_string(). In questo modo non è necessario controllare native path delimiters (nativo WinAPI! = Generico, mentre Posix nativo = generico).

È possibile omettere if (path.generic_string().back() != '/') poiché Posix e WinAPI non si preoccupano di più delimitatori di percorso successivi.

Problemi correlati