Exception beim Versuch ein Verzeichnis zu löschen



  • johhaa schrieb:

    quelltext ausschnitt?

    ... und was für eine Exception?



  • Directory::CreateDirectory(targetDir);
    Directory::SetCurrentDirectory(targetDir);
    System::IO::FileStream * streamWriter = File::Create(targetDir->Insert(targetDir->Length,fileName));
    ...
    streamWriter->Close();
    Directory::SetCurrentDirectory("C:\\");
    

    In einer anderen Methode wird dann versucht, das Verzeichnis zu löschen mit

    Directory::Delete(path, true);
    

    Und da bekomme ich eine "System.IO.IOException in mscorlib.dll", "Zusätzliche Informationen: Der Prozess kann nicht auf die Datei file zugreifen, da sie von einem anderen Prozess verwendet wird."



  • Evtl. weil der StreamWriter noch offen ist? Oder das aktuelle Verzeichnis noch das zu löschende?



  • Nein, den streamwriter schließe ich doch und das Verzeichnis setze ich auf ein ganz anderes 😞



  • Wie kann ich denn prüfen, ob der streamwriter auch wirklich geschlossen worden ist?



  • BTW
    das sieht eher aus wie .NET/CLI
    wuesste nicht das in C# die klassen unter den namesspaces via :: angesprochen werden

    zum fehler versuch mal folgendes, setz streamWriter mal auf eine andere datei in einem anderen verzeichnis
    das eine datei zu ist muss ja nicht heissen das diese auch freigegeben ist



  • adriana schrieb:

    Wie kann ich denn prüfen, ob der streamwriter auch wirklich geschlossen worden ist?

    ich glaub du musst des handle of der datei auch freigeben mit "dispose"

    http://msdn.microsoft.com/en-us/library/system.io.filestream_members.aspx

    bin mir aber da nicht sicher, daher ist ja meine empfehlung zum test den writer woanders hin zeigen zu lassen

    funktioniert der code ohne dem writer?



  • Ich habs hinbekommen, aber ich verstehe nicht wieso das so sein muss. Ich hatte den StreamWriter innerhalb einer Schleife und if-Abfrage benutzt, ihn aber am Ende meiner Methode geschlossen. Jetzt hab ich ihn schon innerhalb der Schleife und if-Abfrage geschlossen und es geht. Kann mir jemand erklären woran das liegt? Werden dann mehrere Instanzen des streamwriters erzeugt bei jedem Durchlauf? Eigentlich sollte es doch auch funktionieren, wenn ich den Streamwriter am Ende schließe?



  • Hellsehen kann niemand. Was Du in Deiner Schleife treibst kann auch niemand sehen, das gleiche wie ein stück weit oben.

    Create selbst erzeugt immer einen neuen Stream der auch geschlossen werden will. (Genauso wie ein new bzw. gcnew ein neues Objekt erstellt)



  • idee

    void Methode1()
    {
        Create streamwriter
        Close streamwriter
        DeleteFolder();
    }
    
    void DeleteFolder()
    {
        Delete folder <-- peng da der streamwriter erst geloescht wird wenn "Methode1" beendet ist
    }
    
    void Methode1()
    {
        if anything then
            Create streamwriter
            Close streamwriter
        end if
        DeleteFolder();
    }
    
    void DeleteFolder()
    {
        Delete folder <-- ok, da streamwriter im ledlich im sichtbarkeit des ifs deklariert wurde - dh bereits geloescht
    }
    


  • Da wir uns im C# Forum aufhalten:

    using(StreamWriter strmw = File.Create(bla))
    {
      // Was auch immer
    }
    
    Directory.Delete(<pfad>,true);
    

    Das using Statement kann man auch noch in eine Schleife packen.

    [Edit]
    @Evil

    Diese Implementierung von Close ruft die Dispose-Methode auf, die den Wert true übergibt.

    Davon abgesehen, das ein Close den Stream wirklich aufräumt, ist Dein Vorschlag für die Füße. Alles was nach verlassen des Namensraum zerstört wird ist eine Referenz auf
    das Objekt. Dadurch wird aber Dispose nicht aufgerufen und der GC führt das dann aus wann immer er will. Beim Aufruf und ausführen von Delete kann das Objekt also durchaus noch bestehen.


Anmelden zum Antworten