FileCreate und DeleteFile



  • Ich habe folgendes Problem:
    Wenn ich beim beenden des Programms ein .ini File erstellen will, und das nicht geht, weil z.B. der aktuelle Ordner schreibgeschützt ist, dann erscheint eine Fehlermeldung.
    Um zu testen, ob der Ordner schreibgeschützt ist, versuche ich mit der Methode "FileCreate" eine Datei zu erstellen, und wenn das nicht geht, wird auch kein .ini File geschrieben.
    Falls ich aber mit der Methode "FileCreate" eine Datei erstellen kann, will ich diese danach mit der Methode "DeleteFile" wieder löschen, doch aus irgendeinem Grund geht das nicht, bzw. die Methode "DeleteFile" liefert immer false zurück.
    Weiss einer von euch woran das liegen kann ?

    So sieht mein Code aus:

    if (FileCreate("test.txt") == -1)
        {
            Application->MessageBox(message.c_str(), "Fehler", MB_ICONERROR | MB_OK);
            return;
        }
        else
        {
            DeleteFile("test.txt");
        }
    


  • Warum fängst du nicht einfach den fehler beim Schreiben der INI datei mit TRY - CATCH ab?



  • Guck in der Hilfe nach "file attribute". Da kannst du den Schreibschutz entfernen.



  • try - catch ist doch eigentlich für exceptions oder ? sorry hab keine ahnung von try und catch hab nur mal in der hilfe nachgeschaut

    also es tritt nicht wirklich eine exception auf, d.h. es kommt einfach eine nachricht wo etwa folgendes steht: fehler beim Schreiben...
    aber bei dieser meldung steht auch nirgends was von einer exception...

    und es geht mir auch nicht ums aufheben des schreibschutzes bzw. das kann ich gar nicht. das problem ist nicht, dass beim aktuellen verzeichnis das attribut schreibgeschützt gesetzt ist, sondern dass der aktuelle benutzer mit welchem ich mich auf dem system anmelde, kein schreibzugriff auf den ordner hat...

    und eigentlich würde ich ja gerne wissen, wie ich die datei, die ich mit FileCreate erstelle wieder löschen kann, da die Methode DeleteFile bei mir immer false zurück gibt, obwohl der dateiname bzw. pfad stimmt, da ich ihn sogar vorher noch mit FileExists geprüft habe...

    Trotzdem vielen Dank für eure Vorschläge



  • @GaZmo
    Guck Dir CreateFile in der BCB-Hilfe mal genau an. Ich denke CreateFile erzeugt nicht nur eine Datei, sondern öffnet diese auch gleich. In diesem Fall solltest Du zuerst FileClose (??) vor dem Löschen aufrufen. Habe gerade keinen BCB auf dem Rechner, also selber nachschauen und probieren 😉



  • ähm, ja, auf die idee bin ich noch gar nicht gekommen 🙄

    wäre ziemlich logisch, wenn das mein problem ist, werde es gleich probieren

    Update:

    Ja hat natürlich geklappt.

    Vielen Dank Peter



  • GaZmo schrieb:

    also es tritt nicht wirklich eine exception auf, d.h. es kommt einfach eine nachricht wo etwa folgendes steht: fehler beim Schreiben...
    aber bei dieser meldung steht auch nirgends was von einer exception...

    Das bezweifle ich. Zeig mal den kompletten Text der Meldung (STRG-C im Dialog).

    Die CreateFile-Variante ist umständlich und unzuverlässig. Dass du die Datei erzeugen konntest heisst noch lange nicht, dass beim Schreiben keine Fehler auftreten könnten.



  • hmm, Jansen hast wieder mal recht, jetzt kommt doch eine Exception:

    ---------------------------
    Benachrichtigung über Debugger-Exception
    ---------------------------
    Im Projekt winStDebug.exe ist eine Exception der Klasse EIniFileException aufgetreten. Meldung: 'In D:\UserData\luca.schweizer\Programmierung\Projekte\QC_PP-Reiniger\winStDebug\winStDebug.ini kann nicht geschrieben werden'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
    ---------------------------
    OK Hilfe
    ---------------------------

    Warum ist denn die FileCreate-Variante so unzuverlässig ?



  • Weil sie dir lediglich zeigt, dass du zu dem Zeitpunkt eine Datei anlegen konntest. Mehr nicht.

    Z.B. könnte ein User oder anderes Programm zur gleichen Zeit versuchen, das Verzeichnis zu löschen, just zwischen deinem FileClose und deinem Schreibzugriff per TIniFile.


Anmelden zum Antworten