none
wie mit "Process kann nicht auf das file zugreifen, da es von einem anderen process verwendet wird" umgehen? RRS feed

  • Frage

  • Tag

    ich möchte mit IO.File.Delete(fileName) eine Datei löschen. Es kommt vor dass diese aus bestimmten Gründen von einem anderen Prozess belegt ist (zb: mp3-file: wird abgespielt).
    Kann ich vorher checken, ob das Delete einen Fehler hervorrufen wird?
    Try-catch klappt jedenfalls nicht zur Fehlerbehandlung.
    Oder muss ich auf On Error zurückgreifen?

    Gruß und Dank!

    TH

    Montag, 11. November 2013 16:15

Antworten

  • Hallo,

    natürlich funktioniert Try Catch, z. B.:

            Try
                System.IO.File.Delete("C:\TEMP\Test.wmv")
            Catch ex As System.UnauthorizedAccessException
                MessageBox.Show("Sie haben keinen Zugriff auf die Datei:" & ex.Message)
            Catch ex As System.IO.IOException
                MessageBox.Show("Die Datei ist derzeit in Verwendung:" & ex.Message)
            End Try
    

    wobei File.Delete noch andere Ausnahmen werfen kann - bis auf PathToLongException wären das aber mehr Programmierfehler.

    Prüfungen nützen nicht wirklich was, da sie ohne Ausnahmebehandlung nicht durchführbar sind. Und womöglich zum Zeitpunkt des Aufrufs von File.Delete bereits veraltet sein können.

    Allgemeiner: On Error wird intern in Try Catch und Zusatzcode zur Unterstützung der veralteten VB Classic Methoden bereitgestellt. Man sollte es in neuem Code ganz vermeiden, denn es führt nur Overhead (und Spaghetti - Code).

    Gruß Elmar

    Montag, 11. November 2013 16:31
    Beantworter

Alle Antworten

  • Hallo,

    natürlich funktioniert Try Catch, z. B.:

            Try
                System.IO.File.Delete("C:\TEMP\Test.wmv")
            Catch ex As System.UnauthorizedAccessException
                MessageBox.Show("Sie haben keinen Zugriff auf die Datei:" & ex.Message)
            Catch ex As System.IO.IOException
                MessageBox.Show("Die Datei ist derzeit in Verwendung:" & ex.Message)
            End Try
    

    wobei File.Delete noch andere Ausnahmen werfen kann - bis auf PathToLongException wären das aber mehr Programmierfehler.

    Prüfungen nützen nicht wirklich was, da sie ohne Ausnahmebehandlung nicht durchführbar sind. Und womöglich zum Zeitpunkt des Aufrufs von File.Delete bereits veraltet sein können.

    Allgemeiner: On Error wird intern in Try Catch und Zusatzcode zur Unterstützung der veralteten VB Classic Methoden bereitgestellt. Man sollte es in neuem Code ganz vermeiden, denn es führt nur Overhead (und Spaghetti - Code).

    Gruß Elmar

    Montag, 11. November 2013 16:31
    Beantworter
  • Hallo,
    OnError vergisst du am besten schnell wieder, das ist "schon viel zu alt" ;)

    Die Delete-Methode löst in einigen Fällen keine Exception aus, wenn die Datei nicht gelöscht werden kann. Siehe hier.

    Hinweis zu Windows NT 4.0: Delete löscht keine Datei, die für normale E/A offen ist oder bei der es sich um eine Datei mit Speicherzuordnung (Memory-Mapped File) handelt.


    Einige Überprüfungsmöglichkeiten findest du auf nachfolgender Seite.
    http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use

    In meiner Signatur findest du einen Konverter für C#/VB.NET.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Montag, 11. November 2013 16:39
    Moderator
  • Hallo Tom,

    die ganze Überprüferei ist letztendlich für die Katz, siehe auch die Kommentare auf Stackoverflow.

    Zumal sie zu den gleichen Ausnahmen führen wie File.Delete => DeleteFile (Windows) und die Error Codes in eine Exception umgewandelt werden. Nur der Fall das die Datei nicht existiert wird stillschweigend fallen gelassen.

    Gruß Elmar

    Montag, 11. November 2013 16:54
    Beantworter
  • So dachte ich mir das eigentlich auch, nur dann habe ich eine MP3 Datei mit dem Media Player in Dauer-Schleife gespeilt und versucht diese mit File.Delete zu löschen. Die Anwendung blieb einfach am Löschen-Befehl hängen. Erst nachdem ich den WMP geschlossen habe wurde das Programm weiter ausgefüht und die Datei gelöscht.

    Die Löungen auf SO habe ich nun nicht getestet, von der Funktionsweise her machen einige aber Sinn - für mich.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Montag, 11. November 2013 16:59
    Moderator
  • natürlich funktioniert Try Catch, z. B.:

    Ok Elmar, vielen Dank,

    Das funzt nicht, wenn man in Debuggen>Ausnahmen bei System.IO einen Haken stetzt bei 'unterbrechen wenn ausgelöst.' Hab das hiermit verstanden (Ich setze diese Haken gerne, damit ich sehe, wo Fehler sind.)

    Wenn ich den Haken hier rausnehme, funktioniert try-catch.

    Gruß und Dank TH

    Montag, 11. November 2013 22:15