<filesystem> erkennt keine Ordner
-
Hallo,
unter Visual Studio 2019 scheint filesystem bei mir keine Ordner zu erkennen. Um das besser zu erläutern habe ich einen kleinen Code als Beispiel geschrieben.#include <iostream> #include <string> #include <filesystem> namespace fs = std::filesystem; bool createFolder(const std::string& e, const std::string& f) { fs::path p = e + f; if (fs::create_directories(p)) { return true; } else { return false; } } void demo_status(const std::string& e, const std::string& f, fs::file_status s) { fs::path p = e + f; std::cout << '\n' << p; if (fs::is_directory(s)) { std::cout << " is a directory\n"; } else { std::cout << " is not a directory\n"; } std::cout << p; if (fs::exists(s)) { std::cout << " exists\n"; } else { std::cout << " does not exists\n"; } } void listDir(const std::string& e) { fs::path p = e; for (auto& p : fs::directory_iterator(p)) { std::cout << p.path() << '\n'; } } ///////////////////////////////////////////////////////////////////////////////////////////// void firstRun(const std::string& e, const std::string& f, fs::file_status s) { std::cout << "\n1:\n"; listDir(e); demo_status(e, f, s); } void secondRun(const std::string& e, const std::string& f, fs::file_status s) { std::cout << "\n2:\n"; fs::path p = e + f; if (createFolder(e, f)) { std::cout << p << " created\n"; } else { std::cout << p << " not created\n"; } } void thirdRun(const std::string& e, const std::string& f, fs::file_status s) { std::cout << "\n3:\n"; listDir(e); demo_status(e, f, s); } int main() { const std::string e = "E:/Codes/"; const std::string f = "file_system_test"; fs::file_status s; firstRun(e, f, s); secondRun(e, f, s); thirdRun(e, f, s); }
Die Ausgabe ist
1: "E:/Codes/C++ Eine Einf³hrung" "E:/Codes/ColorsDemo" "E:/Codes/MiniShooter" "E:/Codes/NYA more colors.7z" "E:/Codes/olcPixelGameEngine-master" "E:/Codes/file_system_test" is not a directory "E:/Codes/file_system_test" does not exists 2: "E:/Codes/file_system_test" created 3: "E:/Codes/C++ Eine Einf³hrung" "E:/Codes/ColorsDemo" "E:/Codes/file_system_test" "E:/Codes/MiniShooter" "E:/Codes/NYA more colors.7z" "E:/Codes/olcPixelGameEngine-master" "E:/Codes/file_system_test" is not a directory "E:/Codes/file_system_test" does not exists
Wie man sieht, wird "file_system_test" erstellt und gelistet, aber nicht erkannt. Wahrscheinlich liegt der Fehler bei mir, aber ich weiß nicht wo.
Grüße
-
wo wird s denn beschrieben?
-
Was wird wo beschrieben? Auf E:? Das ist eigentlich eine ganz normale Partition, keine Windows-eigene.
-
naja in demo_status rufst du fs::isdirectoy(s) und fs::exists(s) auf, aber s wird nirgendwo initialisiert. also kein wunder, dass das fehlschlägt, oder?
-
Yup, aber ich habe kein Beispiel gefunden, wie man fs::file_status initialisiert. Scheint einen Konstruktor zu haben, aber mehr habe ich nicht herausgefunden.
-
//https://en.cppreference.com/w/cpp/experimental/fs/exists #include <iostream> #include <fstream> #include <cstdint> #include <experimental/filesystem> namespace fs = std::experimental::filesystem; void demo_exists(const fs::path& p, fs::file_status s = fs::file_status{}) { std::cout << p; if(fs::status_known(s) ? fs::exists(s) : fs::exists(p)) std::cout << " exists\n"; else std::cout << " does not exist\n"; } int main() { fs::create_directory("sandbox"); std::ofstream("sandbox/file"); // create regular file fs::create_symlink("non-existing", "sandbox/symlink"); demo_exists("sandbox"); for(auto it = fs::directory_iterator("sandbox"); it != fs::directory_iterator(); ++it) demo_exists(*it, it->status()); // use cached status from directory entry fs::remove_all("sandbox"); }
ein klassisches rtfm-problem. übrigens kannst du exists auch den pfad übergeben (laut genannter beschreibung)
-
Ja, alles klar. In diesem Fall müsste ich meine main so ändern:
int main() { const std::string e = "E:/Codes/"; const std::string f = "file_system_test"; fs::path sp = e + f; firstRun(e, f, fs::status(sp)); secondRun(e, f, fs::status(sp)); thirdRun(e, f, fs::status(sp)); }
Danke.