Ich habe einen Dateinamen (C: \ Ordner \ foo.txt) und muss den Ordnernamen (C: \ Ordner) in nicht verwaltetem C ++ abrufen. In C # würde ich so etwas machen:
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
Gibt es eine Funktion, die in nicht verwaltetem C ++ verwendet werden kann, um den Pfad aus dem Dateinamen zu extrahieren?
Verwenden von Boost.Filesystem:
boost::filesystem::path p("C:\\folder\\foo.txt"); boost::filesystem::path dir = p.parent_path();
quelle
p.remove_filename()
wirdp
an Ort und Stelle geändert und kann effizienter implementiert werden alsp = p.parent_path()
parent_path()
daraus"C:\\folder"
resultiert"C:"
.Beispiel von http://www.cplusplus.com/reference/string/string/find_last_of/
// string::find_last_of #include <iostream> #include <string> using namespace std; void SplitFilename (const string& str) { size_t found; cout << "Splitting: " << str << endl; found=str.find_last_of("/\\"); cout << " folder: " << str.substr(0,found) << endl; cout << " file: " << str.substr(found+1) << endl; } int main () { string str1 ("/usr/bin/man"); string str2 ("c:\\windows\\winhelp.exe"); SplitFilename (str1); SplitFilename (str2); return 0; }
quelle
In C ++ 17 existiert eine Klasse
std::filesystem::path
, die die Methode verwendetparent_path
.#include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { for(fs::path p : {"/var/tmp/example.txt", "/", "/var/tmp/."}) std::cout << "The parent path of " << p << " is " << p.parent_path() << '\n'; }
Mögliche Ausgabe:
The parent path of "/var/tmp/example.txt" is "/var/tmp" The parent path of "/" is "" The parent path of "/var/tmp/." is "/var/tmp"
quelle
.remove_filename()
Methode.Warum muss es so kompliziert sein?
#include <windows.h> int main(int argc, char** argv) // argv[0] = C:\dev\test.exe { char *p = strrchr(argv[0], '\\'); if(p) p[0] = 0; printf(argv[0]); // argv[0] = C:\dev }
quelle
auto p = boost::filesystem::path("test/folder/file.txt"); std::cout << p.parent_path() << '\n'; // test/folder std::cout << p.parent_path().filename() << '\n'; // folder std::cout << p.filename() << '\n'; // file.txt
Möglicherweise müssen
p.parent_path().filename()
Sie den Namen des übergeordneten Ordners abrufen.quelle
Verwenden Sie boost :: filesystem. Es wird sowieso in den nächsten Standard aufgenommen, so dass Sie sich genauso gut daran gewöhnen können.
quelle
_splitpath ist eine schöne CRT-Lösung.
quelle
Ich bin so überrascht, dass niemand den Standardweg in Posix erwähnt hat
Bitte verwenden Sie
basename / dirname
Konstrukte.Mann Basisname
quelle
basname(char * path)
und nichtbasename(const char * path)
), und Implementierungen, die dies nicht tun, müssen anscheinend einen statischen Puffer verwenden, der sie threadsicher macht (im Prinzip Sie könnte auch dynamisch zugewiesene Ergebnisse zurückgeben, aber das macht Sie abhängig vonalloc
Familienfunktionen, was in C ++ umständlich ist.Standard C ++ wird in dieser Hinsicht nicht viel für Sie tun, da Pfadnamen plattformspezifisch sind. Sie können die Zeichenfolge manuell analysieren (wie in der Antwort von Glowcoder), Betriebssystemfunktionen verwenden (z. B. http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx ) oder wahrscheinlich die Am besten können Sie eine Dateisystembibliothek eines Drittanbieters wie boost :: filesystem verwenden.
quelle
Verwenden Sie einfach Folgendes: ExtractFilePath (Ihr_Pfad_Dateiname)
quelle