Datei löschen



  • hallo,

    hast du da vielleicht ein Beispiel für? ich kenn' mich damit noch nicht so gut aus... 😞



  • Also, warscheinlich findet das Programm den Pfad zur datei nicht. Also setz z.B.

    DeleteFile ("c:\"+IntToStr(Typ2) + "E.ek");

    Dann wird die Datei auf LW C: gelöscht.

    Ersetze das "c:\" durch einen anderen Pfad und dann dürfte es funktionieren. Wenn du keinen Pfad angibst, sondern nur die Datei, dann sucht er zuerst im Verzeichnis des Programms, dann im Windows und Systemverzeichnis. Deshalb setze immer einen vollständigen Pfad davor, dann kommt es nicht zu Fehlern...



  • ^^ im prinzip richtig, aber nicht ganz:

    DeleteFile ("c:\\" + IntToStr(Typ2) + "E.ek");
    

    PS: Es gibt auch eine sehr gute BCB-Hilfe 😉



  • Hallo,

    danke schonmal,

    Hawkxxx schrieb:

    Wenn du keinen Pfad angibst, sondern nur die Datei, dann sucht er zuerst im Verzeichnis des Programms,

    Aber die Datei bzw. alle Dateien befinden sich im gleichen Ordner - Im Programmordner, wo sich auch die .exe datei befindet.

    ------
    Nachdem ich den Pfad dort eingegeben habe, sagt er:

    Error: Cannot convert 'System::AnsiString' to 'const char*'.
    Error: Type mismatch in parameter 'lpFileName' in call to '__stdcall DeleteFileA(const char*)'.
    

    lg,
    drummi



  • zeigt doch mal den relevaten Quellcode.



  • Hallo,

    es werden die obengenannten Fehlermeldungen angezeigt und die folgende Zeile markiert:

    DeleteFile ("k:\\" + IntToStr(Typ2) + "E.ek");
    

    bzw. :

    DeleteFile ("k:\\" + IntToStr (Typ2) + "EM.ek");
    

    das ist der Code:

    if ((F==2) || (F==3))  //F ist eine int Variable
    {
    try
    {
    RichEdit3->Lines->LoadFromFile (IntToStr (Typ2) + "E.ek");
    String Datei;
    Datei=(IntToStr (Typ2) + "E.ek");
    ShowMessage(Datei);
    DeleteFile ("k:\\" + IntToStr(Typ2) + "E.ek");
    }
    catch (...)
    {
    ShowMessage ("Fehler 1");
    }
    }
    if ((F==1) || (F==3))
    {
    try
    {
    RichEdit3->Lines->LoadFromFile (IntToStr (Typ2) + "EM.ek");
    String Datei;
    Datei=(IntToStr (Typ2) + "EM.ek");
    ShowMessage(Datei);
    DeleteFile ("k:\\" + IntToStr (Typ2) + "EM.ek");
    }
    catch (...)
    {
    ShowMessage ("Fehler 2");
    }
    }
    

    lg,
    drummi



  • Hallo,

    es gibt zwei verschieden Funktionen von DeleteFile():

    //vcl
    bool __fastcall DeleteFile(const AnsiString FileName);
    //api
    BOOL DeleteFile(LPCTSTR lpFileName);
    

    In Deinem Fall versucht der Compiler die API-Funktion aufzufufen, was zum Fehler führt.

    Lösung:

    #include <Sysutils.hpp>
    

    Und wenn das nicht helfen sollte, dann:

    Sysutils::DeleteFile ("k:\\" + IntToStr (Typ2) + "EM.ek");
    


  • hallo,

    hmm...
    bei der ersten variante zeigt er immer noch die gleichen Fehler.

    bei der zweiten sagt er:

    Error: DeleteFileA is not a member of 'Sysutils'.
    


  • Vgl. DeleteFile() und DeleteFileA().



  • schon mal mit remove aus cstdlib oder fstream versucht ?

    EDIT: ups ja sagtest du ja
    Warum nimmst du das nicht, ist das simplste von der Welt 😃 gut deutsch ^^



  • Was passiert, wenn Du folgenden Code verwendest?

    LPCTSTR s = AnsiString("k:\\" + IntToStr (Typ2) + "EM.ek").c_str();
    DeleteFile(s);
    


  • Das kommt mir alles ein bißchen komisch vor. DeleteFile() sollte auch ohne explizites Inkludieren von Sysutils.hpp funktionieren. Zumindest in meinem BCB 6 funktioniert das.

    Ist das Problem in einem Minimalprojekt reproduzierbar?



  • logger schrieb:

    Was passiert, wenn Du folgenden Code verwendest?

    LPCTSTR s = AnsiString("k:\\" + IntToStr (Typ2) + "EM.ek").c_str();
    DeleteFile(s);
    

    keine fehlermeldung mehr, allerdings wird die datei immer noch nicht gelöscht. schreibgeschützt ist die auch nicht.

    lg,
    drummi



  • Hallo,

    Joe_M. schrieb:

    Ist das Problem in einem Minimalprojekt reproduzierbar?

    ich hab's mal ausprobiert. dort funktioniert es. werde es im ganzen Programm dann mal testen. Ich hab jetzt festgestellt, dass ich beim Pfad den Unterordner vergessen habe, da es ja nicht direkt auf dem Laufwerk K gespeichert wird, sondern in Ordner 1, wo sich halt das ganze Programm und alle Dateien befinden.
    Mich wundert es nur, dass es so nicht klappt (ohne den kompltetten Pfad anzugeben (also den Laufwerksbuchstaben)), weil sich die exe Datei ja im gleichen Ordner befindet wie die zu löschende Datei. Werde es jetzt aber nochmal auf die oben angesprochene Weise ohne "k:\\ordner 1" probieren.

    Das Problem daran ist ja, dass das Programm dann ja nicht weiß in welches Laufwerk der Benutzer das Programm installiert bzw. "hingepackt" hat. Oder kann man dies i-wie herausfinden oder abfragen?

    lg,
    drummi



  • Versuch mal als Test den ganzen Pfad einzugeben, ohne diese Zusammenbauaktionen.

    Oder andere Anregung: leg dir eine Textdatei an, und versuche diese zu löschen.
    Somit kannst du prüfen, ob deine Dateien eventuell Schwierigkeiten machen, oder
    die "Delete()" Funktion selbst.

    Oder es kann sein, dass diese Funktion als Eingabeparameter sowas erwartet:

    AnsiString Pfad = "irgendeinpfad";
    DeleteFile(Pfad.c_Str());
    

    Ups zu spät 😉



  • hallo,

    ja, ein bisschen. trotzdem danke.

    ich hab' jetzt einfach mal den Pfad weggelassen und nur den AnsiString mit Typ2 + "EM.ek" genommen. Es funktioniert immer noch!!!

    Danke Leute!!! 👍 👍 👍 👍 🤡 💡

    lg,
    drummi



  • Wobei ich davon abraten möchte, ohne komplette Pfadangabe zu arbeiten. Es reicht einen Open- oder SaveDialog im Prorgamm zu verwenden - und wie von Geisterhand ist ein neues Abeitsverzeichnis gesetzt und die Dateien werden nicht mehr gefunden...

    Ist das Laufwerk zufällgerweise ein Netzwerklaufwerk? Wenn ja, hast Du es mal mit der UNC-Pfadangabe versucht?



  • Hallo,

    Joe_M. schrieb:

    Ist das Laufwerk zufällgerweise ein Netzwerklaufwerk?

    Nein. es ist ein ganz normales laufwerk wie c:\.



  • Dann stimmt etwas mit der Pfadangabe nicht. Irgendwas setzt Du falsch zusammen.
    Du kannst es natürlich ohne Pfadangabe machen, aber wie gesagt, würde ich davon abraten.



  • Hallo,

    Joe_M. schrieb:

    Dann stimmt etwas mit der Pfadangabe nicht. Irgendwas setzt Du falsch zusammen.

    mit Pfadangabe funktioniert es ja auch, aber ich benutze sie nicht, da ich ja nicht weiß, auf welches Laufwerk der Endbenutzer dann das Programm/Spiel hininstalliert.

    Bsp.: Wenn ich die Pfadangabe bei K:\\ lasse und der Endbenutzer hat das Programm aber auf z.B. D:\, dann kann er die Datei ja nicht finden.

    lg,
    drummi


Anmelden zum Antworten