Erzeugte Datei nicht löschbar

  • VB.NET
  • .NET (FX) 4.0

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Erzeugte Datei nicht löschbar

    Moin Forum,

    ich habe ein Problem.
    Ich schilder zunäch mal kurz die Aufgabe:
    Es werden verschiede gerade verwendete Dateien nicht mehr benötigt (sie wurden vorher geöffnet, gelesen, geschlossen).
    Direkt nach dem Schlißen kann ich sie noch nicht löschen:
    System.IO.IOException {"The process cannot access the file 'E:\temp\Test_0007.log' because it is being used by another process."}


    Da diese Dateien auch nach einem Absturz des Computer (kommt leider vor!) gelöscht werden sollen, erstelle ich eine Datei ohne Inhalt ('Test_0007.dat_used.delete'), die Kennzeichnet, dass sie gelöscht werden können.
    Beim Neustart will ich mir dann die Dateien anschauen und die Löschen zu der es die 2. Datei gibt.

    Beim 'normalen' Betrieb versucht eine Klasse nun zyklisch die beiden Dateien zu löschen.
    Dieses dauert oft recht lange und passiert oft erst, wenn ich das Fenster, welches diesen Prozess steuert, schließe.

    Die Frage ist
    Warum bleiben die Dateien geblockt? (Bzw. was mach ich falsch ;) )

    Vielen Dank schon mal im Voraus
    Gruß
    Tukuan

    Achso: Und hier der SourceCode der Lösch-Klasse.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' This class handles the deleting of old used files which are used by methodes and still unter OS control at this time.
    3. ''' The class trys continously to delete the files.
    4. ''' </summary>
    5. ''' <remarks></remarks>
    6. Public Class DeleteSingleFileClass
    7. Public Const UsedFilesAnnex As String = "_used.delete"
    8. Public Class Files2Delete
    9. Friend FullFileName As String
    10. Friend AdditionalFullFileName As String
    11. Friend CoulndtDeleteCounter As Integer
    12. Public Sub New(ByVal _FullFileName As String)
    13. FullFileName = _FullFileName
    14. AdditionalFullFileName = FullFileName & UsedFilesAnnex
    15. IO.File.Create(AdditionalFullFileName)
    16. End Sub
    17. Public Sub New(ByVal _FullFileName As String, ByVal _AdditionalFullFileName As String)
    18. FullFileName = _FullFileName
    19. AdditionalFullFileName = _AdditionalFullFileName
    20. End Sub
    21. End Class
    22. 'Private DeleteFilesTimer As System.Threading.Timer
    23. Private WithEvents DeleteFilesTimer As System.Windows.Forms.Timer
    24. Private FileList2Delete As List(Of Files2Delete)
    25. Private TempFileList As List(Of Files2Delete)
    26. ''' <summary>
    27. '''
    28. ''' </summary>
    29. ''' <remarks></remarks>
    30. Public Sub New()
    31. FileList2Delete = New List(Of Files2Delete)
    32. TempFileList = New List(Of Files2Delete)
    33. 'DeleteFilesTimer = New System.Threading.Timer()
    34. DeleteFilesTimer = New System.Windows.Forms.Timer
    35. DeleteFilesTimer.Interval = 2000 ' 10 s
    36. End Sub
    37. ''' <summary>
    38. ''' Add files to 2 file list
    39. ''' </summary>
    40. ''' <param name="file"></param>
    41. ''' <remarks></remarks>
    42. Public Sub AddFile2FileList(ByVal file As Files2Delete)
    43. TempFileList.Add(file)
    44. DeleteFilesTimer.Start()
    45. End Sub
    46. ''' <summary>
    47. ''' Delete all files in the list. Procedure ist called by a timer continously.
    48. ''' </summary>
    49. ''' <remarks></remarks>
    50. Private Sub DeleteFilesFromList() Handles DeleteFilesTimer.Tick
    51. FileList2Delete.AddRange(TempFileList)
    52. TempFileList.Clear()
    53. Dim deletedList As New List(Of Integer)
    54. For i = 0 To FileList2Delete.Count - 1
    55. Try
    56. 'delete 'Masterfile'
    57. If IO.File.Exists(FileList2Delete(i).FullFileName) Then _
    58. IO.File.Delete(FileList2Delete(i).FullFileName)
    59. 'if no exception occur file is deleted -> delete 'slave file'
    60. If IO.File.Exists(FileList2Delete(i).AdditionalFullFileName) Then _
    61. IO.File.Delete(FileList2Delete(i).AdditionalFullFileName)
    62. deletedList.Add(i)
    63. Catch ex As Exception
    64. 'file is blocked by the system do nothing...
    65. FileList2Delete(i).CoulndtDeleteCounter += 1
    66. End Try
    67. Next
    68. 'remove entries from the list...
    69. For i = deletedList.Count - 1 To 0 Step -1
    70. FileList2Delete.RemoveAt(deletedList(i))
    71. Next
    72. If FileList2Delete.Count = 0 Then DeleteFilesTimer.Stop()
    73. End Sub
    74. End Class

    Tukuan schrieb:

    Direkt nach dem Schlißen
    Poste mal lediglich die Umgebung von 2 Zeilen:
    1. Öffnen der Datei
    2. Schließen der Datei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Pinki Nicht vorsagen. ;)
    @Tukuan Mach folgendes:
    Gib Deiner Klasse Files2Delete eine Delete-Prozedur, in der Du alles aufräumen kannst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ging schnell... Ihr seit klasse :thumbsup:
    Hier z.B.:

    VB.NET-Quellcode

    1. Dim famosFile As New ImcCoreLib.DFile
    2. For i = 1 To fileList.Length - 1
    3. famosFile.Open(fileList(i), ImcCoreLib.DmFileOptionConstants.cdmFileQuickLoad)
    4. For j = 0 To c.Length - 1
    5. c(j).AppendChannel(famosFile.DChannels(j + 1), 0)
    6. Next
    7. famosFile.Close()
    8. Next


    Also danach können die Dateien fileList() weg...
    Ich weiß aber nicht, ob dir das weiterhilft...

    Pinki schrieb:

    Zeile 17 wird ein Stream geöffnet den du nicht schließt.

    Oha... Da fehlt mir wohl noch einiges an Wissen.
    Darf Pinki nicht doch vorsagen, RodFromGermany?

    Ja, könnte eine Delete Prozdur in die Klasse einbauen.
    Aber ist wird das Problem nicht löschen... Hab ja den Grund noch nicht verstanden...

    Tukuan schrieb:

    VB.NET-Quellcode

    1. IO.File.Create(AdditionalFullFileName)
    legt eine Datei an und claimed sie.
    Lass das ggf. weg
    oder
    mach das kommunizierende Close vor dem Delete.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ein Using-Block mit dem Stream reicht völlig, damit das alles korrekt disposed wird.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Jou, aber dazu müsste das Gesamtkonzept grade gezogen werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    claimed sie

    OK. Datei ist 'geclaimed' (dachte, dass geschieht mit einem Open oder Using und nicht mit einem Create...). Und wie gebe ich sie wieder frei?
    Muss ich sie kurz laden und schließen? Also ein

    VB.NET-Quellcode

    1. using Datei
    2. end using
    ?

    VB.NET-Quellcode

    1. Io.file.close

    gibt es ja nicht...

    RodFromGermany schrieb:

    Jou, aber dazu müsste das Gesamtkonzept grade gezogen werden.

    Dat könnte ja auch was sein. Aber wie?

    Für ImcCoreLib.DFile gilt übrigens:
    Ein Using-Operand vom Typ '<Typname>' muss "System.IDisposable" implementieren


    Also würde

    VB.NET-Quellcode

    1. Using
    wohl nicht funktionieren...

    Tukuan schrieb:

    Aber wie?
    Welchen Zweck erfüllt die Klasse Files2Delete?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ist im Prinzip die Basis für eine Liste von Dateien die gelöscht werden kann.
    Mit der New Methode kann man dann gleich die Datei erstellen, die kennzeichnet, dass die originale Datei zum Löschen freigegeben ist, falls das System mal abschiert

    VB.NET-Quellcode

    1. Using myStreamWriter = IO.File.Create(AdditionalFullFileName)
    2. End Using

    Hilft... 8o
    Das klappt jedenfalls schon mal...

    Das wußte ich jedenfalls noch gar nicht...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Tukuan“ ()

    Tukuan schrieb:

    Das wußte ich jedenfalls noch gar nicht...
    Ja, Using ist ein absolut feines Schlüsselwort, z.B. auch zur Erzeugung modaler Dialoge:

    VB.NET-Quellcode

    1. Using dlg As New Form2
    2. dlg.ShowDialog()
    3. End Using
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich kanne es ja auch schon. Nutze es meinstens für Logfiles.
    Mir war bloß nicht klar, dass man mit dem reinen IO.File.Create die Datei noch blocket...
    Was ist denn der Vorteil, wenn ich das ShowDialog in das Using packe?

    Tukuan schrieb:

    Vorteil
    Weil die Klasse Form das Interface IDisposable implementiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ...und somit das Ganze disposed werden kann, denn using legt automatisch ein Try-Finally um den Code.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    legt automatisch
    Das dürfte für den TE etwas zu hoch sein. :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Tukuan TE ist der Thread-Ersteller, in diesem Falle bist Du das.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!