Datei wird nicht freigegeben

  • VB.NET

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datei wird nicht freigegeben

    Hallo,
    ich habe ein Problem, ich finde die Stelle nicht, wo er meint das Bild oder Pfas sei schon in Benutzung.. ich habe an allen Möglichen Stellen wo das Bild in eine Picturebox geladen wird.. diese in ein Stream geladen..
    und diesen auch wieder geschlossen.. ich weiß nicht wo ich noch schauen soll :(

    VB.NET-Quellcode

    1. Dim OriginalPfad As String = PfadBildDaten
    2. Dim NeuerDateiname As String = KundennummerAendernBox.Text
    3. Dim tmpFileInfo As New System.IO.FileInfo(OriginalPfad)
    4. Dim NeuerPfad As String = IO.Path.Combine(My.Application.Info.DirectoryPath & "\bilder", (NeuerDateiname & tmpFileInfo.Extension))
    5. NeuesBild = OriginalPfad 'Pfadangabe für BildErsetzen Form Bild rechts
    6. Dim dbBild As String = (NeuerDateiname & tmpFileInfo.Extension)
    7. If IO.File.Exists(NeuerPfad) Then
    8. 'Wenn Bild vorhanden ist, soll neues Form aufgehen
    9. BildErsetzen.ShowDialog()
    10. If BildErsetzen.DialogResult = DialogResult.OK Then
    11. Try
    12. IO.File.Replace(NeuerPfad, My.Application.Info.DirectoryPath & BildAusDB, My.Application.Info.DirectoryPath & "\backup\" & BildAusDB)
    13. Catch ex As Exception
    14. MessageBox.Show(ex.Message, "Fehler: Bild konnte nicht ausgetauscht werden", MessageBoxButtons.OK, MessageBoxIcon.Error)
    15. End Try


    An dieser Stelle macht er immer einen Fehler: Der Prozess kann nicht aud die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird..

    VB.NET-Quellcode

    1. IO.File.Replace(NeuerPfad, My.Application.Info.DirectoryPath & BildAusDB, My.Application.Info.DirectoryPath & "\backup\" & BildAusDB)



    evtl. hat da jemand eine Lösung oder einen Ansatz wo ich suchen kann
    Danke

    xtts02 schrieb:

    tuvok schrieb:

    wo das Bild in eine Picturebox geladen wird.. diese in ein Stream geladen..
    und diesen auch wieder geschlossen..

    In dem Code-Ausschnitt sehen wir nichts davon.



    Ups .. da hab ich wohl was vergessen :)

    VB.NET-Quellcode

    1. 'Bild im OpenFile Dialog laden und in Picturebox anzeigen
    2. Sub OFD_BildAnzeigen_anlegen()
    3. Try
    4. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    5. Dim OFD As New OpenFileDialog 'OpenFileDialog deklarieren
    6. With OFD
    7. .CheckFileExists = True
    8. .Filter = "Bild Dateien (*.png;*.jpg)|*.png;*.jpg"
    9. .FilterIndex = 2
    10. If OFD.ShowDialog = DialogResult.OK Then 'Wenn OK gedrückt wurde...
    11. PfadBildDaten = OFD.FileName
    12. 'PictureBox1.Image = Image.FromFile(PfadBildDaten)
    13. Dim BildStream As New System.IO.FileStream(PfadBildDaten, IO.FileMode.Open)
    14. PictureBox1.Image = New Bitmap(BildStream)
    15. BildStream.Close()
    16. End If
    17. End With
    18. Catch ex As Exception
    19. MessageBox.Show(ex.Message, "Fehler: bei der Picturebox stimmt was nicht!", MessageBoxButtons.OK, MessageBoxIcon.Error)
    20. End Try


    so .. das is das OFD mit dem Stream das DialogResult.OK ist von nem Form in dem das alte und Neue Bild angezeigt wird
    hm ne.. geht nicht .. verflixt :(

    Edit: gibt es eine Möglichkeit, dass man sich anzeigen lassen kann welcher Prozess Momentan genau auf die Datei zugreift? bzw.
    welcher CodeBlock .. das würde die Suche schon eingrenzen

    jemand noch ne idee?

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

    VB.NET-Quellcode

    1. 'PictureBox1.Image = Image.FromFile(PfadBildDaten)
    2. Dim BildStream As New System.IO.FileStream(PfadBildDaten, IO.FileMode.Open)
    3. PictureBox1.Image = New Bitmap(BildStream)
    4. BildStream.Close()


    Versuche hier mal: Picturebox1.Imagelocation = ...Dateiname...
    Mit einen Stream kettest du dich ja wieder an die Datei...
    Mach nach dem laden eine Kopie von dem Bild.
    Setze die Kopie in die PictureBox und Dispose den Dialog.


    So meinte ich das
    Lade das Bild in eine Variable. Dispose den Ladevorgang.
    Und lege die Kopie in die Pircture Box.

    sorry für meine Formulierung.



    Bernd

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bernd“ ()

    Hallo,
    kann mir evtl. jemand mal nen Dokument über Disposen geben was es einem Verständlich rüber bringt?

    habe es jetzt auch noch mal mit

    VB.NET-Quellcode

    1. PictureBox2.ImageLocation =
    versucht und komplett ohne Stream weil man mir sagte, dass "ImageLocation" das Bild nicht wirklich anfässt aber irgendwie mags mich net..
    OK anscheinend bin ich zu schwer von Begriff..
    so habe ich es im Moment

    VB.NET-Quellcode

    1. Sub daten_anfordern_aendern()
    2. cmd.CommandText = "SELECT * from Kunden Where kdn = '" & KundennummerAendernBox.Text & "'"
    3. Try
    4. con.Open()
    5. reader = cmd.ExecuteReader()
    6. Do While reader.Read()
    7. VornameAendernBox.Text = reader("Vorname").ToString
    8. NachnameAendernBox.Text = reader("Nachname").ToString
    9. AnschriftAendernBox.Text = reader("Anschrift").ToString
    10. TelefonAendernBox.Text = reader("Telefon").ToString
    11. MobilAendernBox.Text = reader("Mobil").ToString
    12. PlzAendernBox.Text = reader("Plz").ToString
    13. OrtAendernBox.Text = reader("Ort").ToString
    14. BemerkungenAendernBox.Text = reader("Bemerkungen").ToString
    15. SonstigesAendernBox.Text = reader("Sonstiges").ToString
    16. BildAusDB = reader("Bildpfad").ToString
    17. Loop
    18. reader.Close()
    19. con.Close()
    20. Catch ex As Exception
    21. MessageBox.Show(ex.Message, String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Information)
    22. Finally
    23. con.Close()
    24. End Try
    25. Using bitmap As Image = Image.FromFile(My.Application.Info.DirectoryPath & BildAusDB)
    26. PictureBox2.Image = New Bitmap(bitmap)
    27. End Using
    28. 'PictureBox2.ImageLocation = My.Application.Info.DirectoryPath & BildAusDB
    29. 'PictureBox2.Image = Image.FromFile(My.Application.Info.DirectoryPath & BildAusDB)
    30. End Sub
    31. Private Sub PictureBox2_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox2.Click
    32. OFD_BildAnzeigen_aendern()
    33. End Sub
    34. Sub OFD_BildAnzeigen_aendern()
    35. Try
    36. PictureBox2.SizeMode = PictureBoxSizeMode.Zoom
    37. Dim OFD As New OpenFileDialog 'OpenFileDialog deklarieren
    38. With OFD
    39. .CheckFileExists = True
    40. .Filter = "Bild Dateien (*.png;*.jpg)|*.png;*.jpg"
    41. .FilterIndex = 2
    42. If OFD.ShowDialog = DialogResult.OK Then 'Wenn OK gedrückt wurde...
    43. PFadBildDatenAE = OFD.FileName
    44. Using bitmap As Image = Image.FromFile(PfadBildDatenAE)
    45. PictureBox2.Image = New Bitmap(bitmap)
    46. End Using
    47. 'PictureBox2.ImageLocation = PFadBildDatenAE
    48. End If
    49. End With
    50. Catch ex As Exception
    51. MessageBox.Show(ex.Message, "Fehler: bei der Picturebox stimmt was nicht!", MessageBoxButtons.OK, MessageBoxIcon.Error)
    52. End Try
    53. End Sub
    54. Private Sub KundeAendernButton_Click(sender As System.Object, e As System.EventArgs) Handles KundeAendernButton.Click
    55. daten_aendern()
    56. End Sub
    57. Private Sub daten_aendern()
    58. Dim OriginalPfad As String = PFadBildDatenAE
    59. Dim NeuerDateiname As String = KundennummerAendernBox.Text
    60. If OriginalPfad = Nothing Then
    61. OriginalPfad = 0 'Wird mit etwas gefüllt wenn es leer ist
    62. End If
    63. Dim tmpFileInfo As New System.IO.FileInfo(OriginalPfad)
    64. Dim NeuerPfad As String = IO.Path.Combine(My.Application.Info.DirectoryPath & "\bilder", (NeuerDateiname & tmpFileInfo.Extension))
    65. NeuesBild = OriginalPfad 'Pfadangabe für -Form BildErsetzen- Bild rechts
    66. Dim dbBild As String = (NeuerDateiname & tmpFileInfo.Extension) 'gibt den Pfad in Form von \bilder\kundennummer.jpg in die Datenbank
    67. 'Pflichtfeld ausfüllen
    68. If Trim(VornameAendernBox.Text) = "" Or Trim(NachnameAendernBox.Text) = "" Or Trim(PlzAendernBox.Text) = "" Or Trim(OrtAendernBox.Text) = "" Or Trim(AnschriftAendernBox.Text) = "" Then
    69. MessageBox.Show("Bitte den vorher alle Felder ausfüllen", String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Information)
    70. Else
    71. If PFadBildDatenAE = Nothing Then 'Wenn PfadBildDaten leer ist, dann soll keine Änderung an der Datei vorgenommen werden 'direkt die Datenbank befüllen
    72. GoTo DBEintragOB
    73. Else
    74. If IO.File.Exists(NeuerPfad) Then
    75. 'Wenn Bild vorhanden ist, soll neues Form aufgehen
    76. BildErsetzen.ShowDialog()
    77. If BildErsetzen.DialogResult = DialogResult.OK Then
    78. Dim sourceFileName As String = NeuerPfad
    79. Dim destinationFileName As String = My.Application.Info.DirectoryPath & BildAusDB ' BildAusDB = \bilder\kundennummer.jpg/png
    80. Dim destinationBackupFileName As String = My.Application.Info.DirectoryPath & "\backup\" & BildAusDB
    81. IO.File.Replace(sourceFileName, destinationFileName, destinationBackupFileName)
    82. End If
    83. End If
    84. DBEintragOB:
    85. cmd.CommandText = "UPDATE Kunden set Vorname = '" &
    86. VornameAendernBox.Text & "', Nachname = '" &
    87. NachnameAendernBox.Text & "', Anschrift = '" &
    88. AnschriftAendernBox.Text & "', Telefon = '" &
    89. TelefonAendernBox.Text & "', Mobil = " &
    90. MobilAendernBox.Text & "," & "Plz = '" &
    91. PlzAendernBox.Text & "', Ort = '" &
    92. OrtAendernBox.Text & "', Bemerkungen = '" &
    93. BemerkungenAendernBox.Text & "', Sonstiges = '" &
    94. SonstigesAendernBox.Text & "' where Kdn = '" &
    95. KundennummerAendernBox.Text & "'"
    96. Try
    97. con.Open()
    98. cmd.ExecuteNonQuery()
    99. con.Close()
    100. MessageBox.Show("Kundendaten ohne Bild geändert!", String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Information)
    101. Catch ex As Exception
    102. MessageBox.Show(ex.Message, "Fehler: Kundendaten konnten nicht geändert werden!", MessageBoxButtons.OK, MessageBoxIcon.Error)
    103. End Try
    104. End If
    105. End If
    106. daten_anfordern()
    107. End Sub
    108. #End Region


    BildErsetzenForm

    VB.NET-Quellcode

    1. Public Class BildErsetzen
    2. Private Sub Abbrechen_Click(sender As System.Object, e As System.EventArgs) Handles Abbrechen.Click
    3. DialogResult = Windows.Forms.DialogResult.Cancel
    4. Me.Close()
    5. End Sub
    6. Private Sub OK_Click(sender As System.Object, e As System.EventArgs) Handles OK.Click
    7. DialogResult = Windows.Forms.DialogResult.OK
    8. Me.Close()
    9. End Sub
    10. Private Sub BildErsetzen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    11. 'Bild wird in ein Stream geladen, damit es frei ist für z.B. löschen
    12. 'PictureBoxALT.ImageLocation = My.Application.Info.DirectoryPath & Hauptform.BildAusDB
    13. Using bitmap As Image = Image.FromFile(My.Application.Info.DirectoryPath & Hauptform.BildAusDB)
    14. PictureBoxALT.Image = New Bitmap(bitmap)
    15. End Using
    16. 'PictureBoxNEU.ImageLocation = Hauptform.NeuesBild
    17. Using bitmap As Image = Image.FromFile(Hauptform.NeuesBild)
    18. PictureBoxNEU.Image = New Bitmap(bitmap)
    19. End Using
    20. 'PictureBoxALT.Image = Image.FromFile(My.Application.Info.DirectoryPath & Hauptform.BildAusDB)
    21. 'PictureBoxNEU.Image = Image.FromFile(Hauptform.NeuesBild)
    22. End Sub
    23. End Class
    Bau dir mal sowas dazwischen und lass die Dateien auf der HDD generell in ruhe.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Bildvorschau anzeigen
    3. ''' </summary>
    4. ''' <param name="Pfad">Pfad der Datei</param>
    5. ''' <returns>Returns ein Image</returns>
    6. ''' <remarks></remarks>
    7. Public Function Bildvorschau_Anzeigen(ByVal Pfad As String) As Image
    8. Dim KeinBild As Image = Nothing
    9. ' Kopie von Bild
    10. Try
    11. Dim ImgSource As Image = Image.FromFile(Pfad)
    12. Dim ImgDest As New Bitmap(ImgSource)
    13. 'PB_Bilder.BackgroundImage = ImgDest
    14. Return ImgDest
    15. ImgSource.Dispose()
    16. Exit Function
    17. Catch ex As Exception
    18. 'MessageBox.Show(ex.Message)
    19. End Try
    20. Return KeinBild
    21. End Function

    oder halt so

    VB.NET-Quellcode

    1. Dim Bild As String = BildHolen("Dein Bild")
    2. Dim lImgSource As Image = Image.FromFile(Bild)
    3. Dim lImgDest As New Bitmap(lImgSource)
    4. lImgSource.Dispose()