2013-08-03 7 views
10

Ich habe ein Programm, das einen Ordnerpfad als Befehlszeilenargument verwendet. Und dann verkette ich das mit Dateinamen, um auf diese Dateien zuzugreifen.Gibt es ein Idiom, um einem Dateipfad einen Schrägstrich hinzuzufügen?

Zum Beispiel folder_path ist "./config/" und dann würde file_path sein "./config/app.conf", wie unten

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

gezeigt Aber das würde nicht funktionieren, wenn folder_path ‚doesn t enthält einen Endstrich. Es scheint ein häufiges Problem zu sein, also habe ich mich gefragt, ob es ein Idiom gibt, um am Ende den Schrägstrich hinzuzufügen, wenn es nicht existiert.

+1

Ich kenne kein Idiom, aber ich denke, dass eine Bibliothek wie Boost-Dateisystem viel flexibler ist, müssen Sie sich keine Sorgen über Schrägstriche oder Backslashes (Windows). Außerdem wird diese Bibliothek Teil der Standardbibliothek sein. – dieram3

Antwort

11

ich dies in der Regel tun, wenn der Pfad in einem std :: string genannt Pfadname ist:

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

Oder mit basic_string :: zurück():

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

einen Fall hinzu Backslash falls nötig.

Hinzugefügt: Beachten Sie auch, dass * nix aufeinanderfolgende Schrägstriche in Pfadnamen als einzelnen Schrägstrich behandelt. In vielen Situationen ist es also ausreichend, nur einen Schrägstrich ohne Überprüfung hinzuzufügen.

2

Linux kümmert sich nicht, wenn Sie einen zusätzlichen Schrägstrich haben, so/home/user/hallo und/home/user // hallo sind der gleiche Ort. Sie könnten den Schrägstrich als Failsafe hinzufügen. Oder Sie können nachsehen, indem Sie das letzte Zeichen überprüfen.

0

Verwendung von 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 die fs::path::generic_string(). Auf diese Weise müssen Sie nicht nach native path delimiters suchen (WinAPI nativ! = Generisch, während Posix nativ = generisch ist).

Sie könnten if (path.generic_string().back() != '/') weglassen, da Posix und WinAPI sich nicht um mehrere aufeinanderfolgende Pfadbegrenzer kümmern.

Verwandte Themen