Wie kann ich prüfen ob eine Datei mit einem bestimmten Namen vorhanden ist?



  • Einfach probieren zu tun und dann eventuelle Fehler zu behandeln ist mMn. allgemein die bessere Möglichkeit.

    Habe nie verstanden warum manche Programmierer grundsätzlich immer erst prüfen ob irgendwas möglich ist, bevor sie es dann tun.
    Die Programme die daraus entstehen sind fast immer schlechter als die Programme die mit dem "einfach versuchen zu machen" Modell entstehen.



  • hustbaer schrieb:

    Einfach probieren zu tun und dann eventuelle Fehler zu behandeln ist mMn. allgemein die bessere Möglichkeit.

    Zumal auch noch die Möglichkeit besteht, dass die Datei zwischen dem exists() und dem Öffnen aus dem Dateisystem verschwindet 😃



  • Also wenn ich mir mal - nur so aus Quatsch - vorstelle, ich sei ein Computer, und das, was der TE in seinem Eingangspost schreibt, sei mein Programm/meine Aufgabe ...
    Dann käme ich nicht auf die Idee, die Datei ohne Weiteres zum Schreiben zu öffnen und damit den evtl. vorhandenen Inhalt zu löschen ...

    Da steht nämlich nirgends, dass die Datei - falls vorhanden - zum Schreiben geöffnet werden soll ...



  • Hallo,

    ich hatte vor einiger Zeit mal mittels dirent.h etwas gebastelt.

    #include <iostream>
    
    #include <dirent.h>
    
    int main(int argc, char* argv[]) {
    
    	const std::string directory( argv[1] );
    	const std::string file( argv[2] );
    	const std::string suffix(".dat");
    
    	DIR* dir = opendir(directory.c_str());
    
    	struct dirent* ent;
    
    	while( (ent = readdir( dir )) != NULL ) {
    
    		const std::string tmp_str( ent -> d_name );
    
    		std::size_t found = tmp_str.find(file + suffix);
    
    		if( found != std::string::npos ) {
    			std::cout << file + suffix << " found in "
    				        << directory << std::endl;
    		}
    	}
    
    	closedir( dir );
    
    	return 0;
    }
    

    Verwendung

    $ ./a.out ~klaus/sandkasten/ something
    something.dat found in /home/klaus/sandkasten/
    

    Gruß,
    Klaus.



  • Toll jetzt haben wir eine Lösung die:
    - nicht unter Windows funktioniert
    - immer noch das Problem hat, dass eine Datei plötzlich verschwinden oder auftauchen kann
    - wesentlich komplizierter ist



  • Und dazu ist sie noch falsch. Deine Funktion findet alle Dateien in denen überhaupt der file string vorkommt. Die suffix Variable wird auch einfach mal nur für die Ausgabe benutzt.



  • sebi707 schrieb:

    Und dazu ist sie noch falsch. Deine Funktion findet alle Dateien in denen überhaupt der file string vorkommt. Die suffix Variable wird auch einfach mal nur für die Ausgabe benutzt.

    Da hast du recht, ich habe es korrigiert, indem ich suffix direkt angehängt habe.

    Ob und wie es jetzt weiterhilft muss der Thread Starter sagen. Immerhin kann man darauf aufbauen und ist das einzige compilierfähige Minimalbeispiel, dass ich in diesem Thread gesehen habe. :p

    Gruß,
    Klaus.


  • Mod

    Klaus82 schrieb:

    […] und ist das einzige compilierfähige Minimalbeispiel, dass ich in diesem Thread gesehen habe. :p

    Das ist kein Kriterium.

    #include <boost/filesystem.hpp>
    #include <iostream>
    
    int main() {
        std::cout << (not boost::filesystem::exists("my.dat")? "Not f" : "F") << "ound";
    }
    


  • Arcoth schrieb:

    std::cout << (not boost::filesystem::exists("my.dat")? "Not f" : "F") << "ound";
    

    Da denkt man, man hätte von C++ nach all den Jahren schon so grob alles mal gesehen, da kommt jemand daher und gräbt tatsächlich ein Schlüsselwort aus, das ich noch nicht kannte. Echt jetzt? not ? ... jetzt fehlen eigentlich nur noch begin , end und then um die Sprache nicht mehr wiederzuerkennen 😃


  • Mod

    Der einzige Grund, warum ich es hier verwendet habe, ist, um den Unreg aufzuregen, der sich vor einer Weile mal über mich mockiert hat weil ich not in irgendeinem Template benutzt hab'. 😃

    Ja, ich verwende es ab und an, macht einige Dinge IMO lesbarer.



  • Arcoth schrieb:

    Der einzige Grund, warum ich es hier verwendet habe, ist, um den Unreg aufzuregen, der sich vor einer Weile mal über mich mockiert hat weil ich not in irgendeinem Template benutzt hab'. 😃

    Ja, ich verwende es ab und an, macht einige Dinge IMO lesbarer.

    Ich kannte die Keywords bis jetzt auch noch nicht vor allem wenn man mal googled findet man ja noch eine Reihe anderer.

    Ist ja im Grunde nur ein anderes naming für nen Token von daher wüsste ich jetzt nicht was daran schlimm sein sollte.



  • Arcoth schrieb:

    Ja, ich verwende es ab und an, macht einige Dinge IMO lesbarer.

    Jo, da ist was dran. So ein dünnes ! überliest man schonmal leicht.



  • Finnegan schrieb:

    Arcoth schrieb:

    Ja, ich verwende es ab und an, macht einige Dinge IMO lesbarer.

    Jo, da ist was dran. So ein dünnes ! überliest man schonmal leicht.

    Deswegen schreibt man bei wichtigen Not-Lösungen "!!!" statt "!"!!!

    Oder man nimmt keine Not-Lösung.

    std::cout << (boost::filesystem::exists("my.dat")? "F" : "Not f") << "ound";
    


  • Also wenn wir schon bei lesbarkeit sind find ich das Zerhacken des output strings viel bemerkenswerter als das not keyword... Vor allem weils noch nicht mal kürzer ist 😃

    std::cout << (boost::filesystem::exists("my.dat") ? "F" : "Not f") << "ound"; // F not found?
    std::cout << (boost::filesystem::exists("my.dat") ? "Found" : "Not found");
    


  • happystudent schrieb:

    Also wenn wir schon bei lesbarkeit sind find ich das Zerhacken des output strings viel bemerkenswerter als das not keyword... Vor allem weils noch nicht mal kürzer ist 😃

    msg.Format( _T("%u site%s found"), sites, sites > 1 ? _T("s") : _T("") );
    

    😉



  • happystudent schrieb:

    Also wenn wir schon bei lesbarkeit sind find ich das Zerhacken des output strings viel bemerkenswerter als das not keyword... Vor allem weils noch nicht mal kürzer ist 😃

    std::cout << (boost::filesystem::exists("my.dat") ? "F" : "Not f") << "ound"; // F not found?
    std::cout << (boost::filesystem::exists("my.dat") ? "Found" : "Not found");
    

    Nee, ist gleich lang, wenn man wie ich die nutzlosen Leerzeichen wegläßt. (Dafür 24p-Font, wer echt mehr als 80x25 monochrom braucht, hat ein Problem im Code.)

    std::cout<<(boost::filesystem::exists("my.dat")?"F":"Not f")<<"ound";
    std::cout<<(boost::filesystem::exists("my.dat")?"Found":"Not found");
    std::cout<<"Not f\0Found"[boost::filesystem::exists("my.dat")*7];
    

    Ist aber alles nix, was ich ohne Leerzeichen schreiben würde, also gehts noch übersichtlicher bei gleicher Performance, würde ich vermuten.



  • volkard schrieb:

    std::cout<<"Not f\0Found"[boost::filesystem::exists("my.dat")*7];
    

    Gibt je nachdem ob das File existiert 'N' oder 'o' aus.
    Und nichtmal mit + statt [] würde ein Schuh draus, denn dann würde "Not f" bzw. "ound" ausgegeben.



  • Arcoth schrieb:

    Falls du, wie es scheint, einfach den Inhalt überschreiben möchtest falls die Datei existiert, reicht es den Ausgabestream mit std::ios_base::trunc zu öffnen. I.e. man muss dann gar nicht die Existenz der Datei prüfen.

    Nicht ganz, ich möchte prüfen ob die datei vorhanden ist und dann, falls ja, etwas auslesen.



  • Auch beim Lesen musst du die Existenz der Datei nicht vorher prüfen. Es reicht aus nach dem Öffnen zu überprüfen, ob die Datei geöffnet werden konnte. Z. B.:

    std::ifstream is("datei");
    if (!is)
    {
        // Datei konnte nicht geöffnet werden
    }
    

  • Mod

    Ich glaube, hustbaers Aussage bestätigt sich gerade.
    Warum nicht einfach lesen?

    std::ifstream is("datei");
    if (!(is >> myObj))
    {
        // Konnte - aus welchem Grund auch immer - nicht lesen
    }
    

    Solltest du tatsächlich den Fall "Konnte Datei nicht öffnen" (nicht "Datei existiert nicht", denn zwischen dem und e.g. "Keine Leserechte gegeben" besteht kein Unterschied für deine Zwecke) gesondert behandeln wollen, nimm is_open .


Anmelden zum Antworten