Datei löschen



  • Hallo,

    also jetzt bin ich verzweifelt.
    Ich will eine Datei löschen. Den Dateinamen ermittle ich vorher:

    String Datei;
    Datei=(IntToStr (Typ2) + "E.ek");
    

    Danach will ich die Datei löschen, aber es klappt nicht. Die Datei ist nach dem Löschen immer noch da. Ich folgendes schon probiert:

    int remove (const char *Datei);
    
    DeleteFile ((Typ2) + "E.ek");
    

    Bei Google schreiben die, dass das funktioniert.

    Kann mir jemand helfen? 😕



  • Was steht denn in Typ2? Und wie setzt Du das zusammen? Debugger?
    Hast Du die nötigen Rechte?



  • hallo,

    also, die Datei setzt sich wie folgt zusammen:

    die Datei ist eine Zahl mit einem Buchstaben mit der Dateiendung .ek, also:

    1E.ek
    2E.ek
    15E.ek
    usw.

    Typ2 ist ein "int". Dadrin steht die Zahl (z.b 1). Dann wird dahinter gefügt "E.ek", was zusammen 1E.ek ergibt. Das ganze wird so in den String Datei geschrieben.

    Also Rechte müsste ich haben, da ich Admin bin und die Dateien (eigentl.) nicht schreibgeschützt sind.

    lg,
    drummi



  • Versuch es mal mit absoluten Pfaden anstatt mit relativen. Eventuell wirst Du Application::ExeName in Verbindung mit ExtractFilePath() benötigen.



  • 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


Log in to reply