Zugriffsfehler beim löschen wegen Offener Datei



  • Hi leute!

    Ich hab folgendes Problem:

    Ich Lade mit der IndyHTTP komponente ne Datei runter (funktioniert). Ich kann während dem Downlaod den Downlaod per Button abbrechen (funktioniert auch). Jetzt kommt mein Problem: Wie kann ich diese Datei während der Programmlaufzeit löschen? Wenn ich es per Hand versuche (während das Programm läuft) kommt der Fehler: "Datei kann nicht gelöscht werden: Eine Zugriffsverletzung ist aufgetreten. Die Quell oder Zieldatei ist möglicherweise geöffnet"! Ich mein ich kann verstehen das er meckert! Weil ich breche den Download ab indem ich einfach nen IdHTTP1->Disconnect(); rein bringe. Hier jetzt meine Frage: Wie schließe ich diese Offene Datei um sie löschen zu können? Wenn ihr noch Infos braucht dann sagte bescheid!

    Ich hoffe Ihr könnt mir antworten weil in der suche hab ich nur den Beitrag gefunden den der schreiber mit den Worten: "Es funktioniert in 90 % der fälle, also lass ich es so..." beendet und das is für mich end ok weil dieses Programm mein Abschluss Projekt wird für meine Schule!

    cYa pl1zahd

    p.s.: Danke schonmal im voraus für die Antworten!



  • Zeig mal den Codeabschnitt, in dem du die Datei herunterlädst bzw. speicherst.



  • k hier mal der Code:

    void __fastcall TDM_download::AfterShow()
    {
      Show(); // Standard-Show aufrufen
      Application->ProcessMessages(); // alles fertigzeichnen lassen
    
      // jetzt der eigene, im "OnAfterShow" auszuführende Code
      try
      {TFileStream *fs = new TFileStream(DM_link->save_filename, fmCreate);
    
      IdHTTP1->Get(URL, fs); //Hier wird geladen
    
      delete fs;
      }
      catch(EIdConnClosedGracefully &c)
      {
            Hide();
      }
    

    Ich arbeite mit OnWork! In dem on work block wird ein fortschrittsbalken erhöht und dann mit Application->ProcessMessage(); geschaut das man auf abbrechen klicken kann!

    Und hier fürs Abbrechen:

    void __fastcall TDM_download::btnAbbrechenClick(TObject *Sender)
    {
    
    IdHTTP1->Disconnect();
    
    }
    

    Also ich könnte als Notlösung (falls es ned direkt geht) auch noch nen löschprogramm schreiben das direkt als letzter Befehl vor dem schließen aufgerufen wird und danach das Hauptprogramm schließt und danach die Dateien löscht... wäre aber keine elegante lösung, da man wenn man 2. die selbe datei downloaden will (mit gleichem namen) und die 1. datei abgebrochen hat man die 2. datei nicht unterm selben Namen abspeichern kann (selbe Fehlermeldung)!

    edit: Ich hab den code ma aufs wesentliche reduziert, dar das mit meinem Stringgrid ja nix mit dem code zu tun hat im moment!



  • Ich hab jetzt den code gepostet... wenn ihr noch was braucht sagt bescheid... aber bitte helft mir komme an dem problem einfach nicht vorbei... kann man das anderes lösen? das man vor dem Download mit idHTTP vieleicht die datei anderst anlegt als mit einem FileStream?

    schreibt bitte!

    cYa pl1zahd



  • Ich bin mir nicht ganz sicher, woran's nun liegt. Aber wenn Du den Download abbrichst, wird
    wahrscheinlich die Zeile in der Du den FileStream löschst, gar nicht aufgerufen, oder?
    Versuch's doch mal so:

    TFileStream *fs = 0;
      try
      {
        fs = new TFileStream(DM_link->save_filename, fmCreate);
        try
        {
          IdHTTP1->Get(URL, fs); //Hier wird geladen
        }
        catch(EIdConnClosedGracefully &c)
        {
          Hide();
        }
      }
      __finally
      {
        delete fs;
      }
    

    Gruß,

    Alexander



  • Vielen Dank Alexander!

    Damit funktioniert es! Jetzt muss ich nur noch 1 problem lösen und dann is mein Abschlssprojekt fertig! Aber dieses problem wird ja in nem anderen Thema besprochen (siehe "Dateigröße feststellen")!

    Danke an alle!

    cYa pl1zahd


Anmelden zum Antworten