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



  • Hallo,
    mein Problem:

    Man soll einen beliebigen Namen für eine .dat Datei eingeben. Das Programm soll nun überprüfen ob diese Datei vorhanden ist und wenn nicht, eine neue Datei erstellen.

    Danke schonmal.

    MFG Kwasselkopp



  • Direkt gibts da keine Funktion. Aber du kannst eine Datei zum lesen öffnen und prüfen ob das erfolgreich ist (http://en.cppreference.com/w/cpp/io/basic_ifstream/is_open). Was soll überhaupt passieren wenn die Datei schon existiert? Für den Fall das der Inhalt überschrieben oder hinten angehängt werden soll gibts schon entsprechende Optionen (http://en.cppreference.com/w/cpp/io/basic_filebuf/open).



  • Sollte man gar nicht ueberpruefen, weil zwischen Ueberpruefung und schreiben sich schon wieder was geaendert haben kann.


  • Mod

    @sebi: Warum die Referenz für filebuf angeben?

    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.



  • Arcoth schrieb:

    @sebi: Warum die Referenz für filebuf angeben?

    Weil es dort eine Übersicht über alle Kombinationen der Open Modes und dem resultierenden Effekt gibt. Nur aus dem openmode Eintrag wird nicht klar, dass es einen Fehler gibt wenn man eine nicht existierende Datei zum lesen öffnet.



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

    Diese Lösung ist nicht nur deswegen schöner, weil sie weniger Code benötigt, sondern auch noch sicherstellt, dass die Datei schreibbar 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");
    

Log in to reply