FRAGE: dateiexistenz überprüfen



  • Erst mal Hallo!

    Ich bin kein erfahrener C Programmierer, also ist es leicht möglich, dass meine Frage lächerlich erscheint 🙂

    also meine frage ist nun, wie ich überprüfen kann, ob eine datei, an die ich was anhängen will, schon existiert.

    gedacht hätte ich es mir in etwa wie folgt (was allerdings nicht funktioniert:

    FILE *daten

    daten=fopen(dateiname, a)

    if (daten==NULL)

    {
    // was anderes reinschreiben als wenn sie schon existiert

    }

    else

    {
    //das normale reinschreiben
    }

    vielleicht kann mir ja wer eine funktionierende lösung sagen!

    mfg SharkT



  • ahh ihr habt da ja so ein schönes feature 👍

    FILE *daten;
    
    daten=fopen(dateiname, a); 
    
    if (daten==NULL) 
    
    { 
    // was anderes reinschreiben als wenn sie schon existiert 
    
    } 
    
    else 
    
    { 
    //das normale reinschreiben 
    }
    


  • In C wäre das ne Idee:

    FILE *fd;
    
    if(NULL == (fd = fopen("datei.txt", "r"))) { /* Wo keine Datei ist, kann man keine öffnen */
      fd = fopen("datei.txt", "w");
    
      /* Kram reinschreiben */
    } else {
      fclose(fd);
      fd = fopen("datei.txt", "a");
    
      /* Kram an die Datei anhängen */
    }
    

    Wobei du damit nicht abgefangen kriegst, ob die Datei vielleicht existiert und aus einem anderen Grund nicht geöffnet werden kann. Alle anderen Lösungen sind plattformabhängig, allerdings gibt es ne boost-library, die diese ganzen Ansätze in ein relativ plattformunabhängiges Interface kapselt: http://www.boost.org/libs/filesystem/doc/index.htm

    Damit sähe das dann etwa so aus:

    #include "boost/filesystem/operations.hpp"
    #include "boost/filesystem/path.hpp"
    
    //...
    
    if(boost::filesystem::exists(boost::filesystem::path("datei.txt"))) {
      //Datei existiert
    } else {
      //Datei existiert nicht.
    }
    


  • big thx!!! jetzt schauma mal obs funktioniert!

    wird im rahmen von einem c script in siemens wincc verwendet, zum messwert protokollieren, die qualitätssicherer bilden sich sowas ein.

    mfg SharkT



  • HEUREKA es geht!

    wenn du mal hilfe im sps programmieren oder zugehörigem brauchst, einfach fragen!

    mfg Shark T



  • 0xdeadbeef schrieb:

    Wobei du damit nicht abgefangen kriegst, ob die Datei vielleicht existiert und aus einem anderen Grund nicht geöffnet werden kann. Alle anderen Lösungen sind plattformabhängig, allerdings gibt es ne boost-library, die diese ganzen Ansätze in ein relativ plattformunabhängiges Interface kapselt: http://www.boost.org/libs/filesystem/doc/index.htm

    Damit sähe das dann etwa so aus:

    #include "boost/filesystem/operations.hpp"
    #include "boost/filesystem/path.hpp"
    
    //...
    
    if(boost::filesystem::exists(boost::filesystem::path("datei.txt"))) {
      //Datei existiert
    } else {
      //Datei existiert nicht.
    }
    

    Naja,

    AFAIK ist auch das möglich ohne boost:

    std::ifstream file("datei.txt", std::ios::in);
    if(file.is_open())
    {
     // Datei existiert nicht
    }
    else
    {
      // Datei existiert
    }
    

    MfG eViLiSSiMo



  • @evilissimo
    nein, so prüfst du ja nur, ob du die Datei zum lesen öffnen kannst. Wenn die Datei zB. nur Schreibrechte hat, dann sollte das öffnen trotzdem fehlschlagen, auch wenn die Datei existiert



  • Da hänge ich mich mit meinem Problem einfach mal dran:

    Prüfen, ob path("datei.txt") existiert -> funktioniert wunderbar.
    Nun wollte ich testen, ob das Verzeichnis "D:\Dev\Test" existiert -> geht nicht (Exception beim Ausführen). Das liegt wohl am ":". Ohne den gibts keine Exception. Aber obwohl das Verzeichnis existiert findet boot::filesystem::exists den Pfad nicht.

    Ich habe mir die Doku unter http://www.boost.org/libs/filesystem/doc/path.htm durchgelesen, das hat mir aber nicht viel weitergeholfen.

    Könnte mir jemand einen Tipp geben?

    Danke,

    Karl



  • Boost::Filesystem erwartet per default eine Pfad Angabe im Boost-Filesystem Syntax (ist ähnlich wie POSIX), wenn du das ändern willst, dann musst du den name_check auf native stellen. Lies mal in der Doku zu path, da steht das alles drin.


Anmelden zum Antworten