<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.


Log in to reply