Announcement

Collapse
No announcement yet.

File.Create / File.Delete

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • File.Create / File.Delete

    Hallo Forum,

    folgende Anweisungen führen dazu, daß ein Fehler beim Löschen der gerade erzeugten Datei ausgelöst wird der offensichtlich daher resultiert, daß ein Handle auf einer erzeugten Datei nicht entfernt wird. Meldung sinngemäß (...Datei wird von Prozess verwendet...)

    System.IO.File.Create("C:\TestFile.txt")
    System.IO.File.Delete("C:\TestFile.txt")

    Wie entferne ich denn nun den Handle damit diese Operation gelingt ??

    Folgende Anweisung funktioniert, erscheint mir aber völlig schwachsinnig

    Using System.IO.File.Create("C:\TestFile.txt")
    End Using
    System.IO.File.Delete("C:\TestFile.txt")

    Grüße
    FoxRunner

  • #2
    Bei File.Create kommt nunmal ein FileStream zurück und der muß weg bevor du das File wieder löschen kannst. Um deterministisches Verhalten zu erreichen ist also ein eigenes Aufrufen von Dispose unerläßlich, z.B eben wie bei dir durch einen using Block.

    Aber wo wir gerade bei Schwachsinn sind. Welchen Sinn macht es eine Datei anzulegen und sofort wieder zu löschen? Normalerweise würde man nach dem Create den Filestream auch benutzen dann sieht der Syntax mit dem using, wenn dann eben auch Code drinsteht, wieder wesentlich intelligenter aus.

    Comment


    • #3
      Hallo Ralf,
      danke für Deine Antwort. Natürlich macht mein Beispiel in diesem Zusammenhang absolut keinen Sinn, aber in dem gesamten Szenario das ich habe wurde eine Datei erzeugt die zu einem späteren Zeitpunkt wieder gelöscht werden soll. Das hier ist nur der Extrakt.

      Ich habe das mit dem Dispose nicht verstanden. Wie geht das. Kannst Du mir kurz meinen Minicode ergänzen. Danke

      Foxrunner

      Comment


      • #4
        Dispose ist die Methode die am Ende des using Blocks automatisch aufgerufen wird. Die kann man natürlich genauso gut von Hand aufrufen und using weglassen. Also einfach fileStream.Dispose(). Normalerweise ist aber der Einsatz von using der richtige Weg.
        Code:
        System.IO.File.Create("C:\TestFile.txt").Dispose()
        
        .... hier sinnvollen Code ergänzen
        
        System.IO.File.Delete("C:\TestFile.txt")

        Comment


        • #5
          Ralf,
          super! Jetzt hab ichs auch kapiert.
          Vielen Dank !!

          FoxRunner

          Comment


          • #6
            ich hoffe du hast auch verstanden dass mit dem kleinen Snippet von Ralf du nicht über den Stream auf die Datei zugreifen kannst da du dieses Objekt sofort zerstört hast ...
            Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

            Comment


            • #7
              Warum hoffst Du das?
              Inhaltlich ist mir das aber klar. Aber in meinem Fall will ich das auch gar nicht, sondern nur anhand eines kleinen Beispiels zeigen wie man Dateien anlegt, kopiert und löscht., usw.
              Aber Danke für den Hinweis

              Comment


              • #8
                aso ja dann ist es ja gut ich dachte nur nicht dass es zu Verwirrung führt. Denn ist ja doch selten dass man Dateien erstellt die man nicht wirklich braucht
                Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                Comment


                • #9
                  Hallo,

                  ich habe auch ein Problem, das passt hier rein: Ich habe ein Grid mit zu einem Thema gehörenden Dokumenten (pdf, Bilder etc.). Ich kann über einen Button im Grid mir eine Voransicht anzeigen lassen, dafür generiere ich einfach eine Form, wenn es ein Bild ist, wird dieses in einer Picturebox angezeigt, ist es ein PDF, dann in einem Webbrowser. Funktioniert auch alles ganz zufriedenstellend. Nur wenn ich eine solche Datei löschen will, geht das nicht, weil da "ein anderer Prozess" noch auf diese Datei zugreift. Das muss eben meine Voransicht sein. Nur wie kriege ich das weg?

                  Die Voransicht wird folgendermassen angelegt:[highlight=vbnet] If IsNothing(frmVoransicht) Then
                  frmVoransicht = New Form
                  Dim wb As New WebBrowser
                  wb.Name = "wb"
                  frmVoransicht.Controls.Add(wb)
                  wb.Dock = DockStyle.Fill
                  Dim pb As New PictureBox
                  pb.Name = "pb"
                  pb.SizeMode = PictureBoxSizeMode.Normal
                  frmVoransicht.Controls.Add(pb)
                  pb.Dock = DockStyle.Fill
                  End If
                  If datei.Length = 0 OrElse Not My.Computer.FileSystem.FileExists(datei) Then
                  MsgBox("Das Dokument '" + datei + "' konnte nicht gefunden werden.", MsgBoxStyle.Critical, "Datei prüfen ...")
                  Else
                  If datei.ToLower.EndsWith("gif") Or datei.ToLower.EndsWith("jpg") Then
                  frmVoransicht.Controls("wb").Visible = False
                  frmVoransicht.Controls("pb").Visible = True
                  Dim img As Image = Image.FromFile(datei)
                  CType(frmVoransicht.Controls("pb"), PictureBox).Image = img
                  frmVoransicht.Top = 10
                  If img.Height < CInt((Screen.PrimaryScreen.WorkingArea.Height - 40) / 1.3) Then frmVoransicht.Height = img.Height + 10
                  ElseIf datei.ToLower.EndsWith("pdf") Then
                  frmVoransicht.Controls("pb").Visible = False
                  frmVoransicht.Controls("wb").Visible = True
                  frmVoransicht.Top = 10
                  frmVoransicht.Height = My.Forms.frmMain.Height - 40
                  CType(frmVoransicht.Controls("wb"), WebBrowser).Navigate(New Uri(datei))
                  Else
                  MsgBox("Es können in der Voransicht nur PDF, GIF und JPG angezeigt werden.", MsgBoxStyle.Information, "Datei prüfen ...")
                  Exit Sub
                  End If
                  frmVoransicht.Show()
                  End If[/highlight]
                  Und das Löschen wollte ich eigentlich so besorgen:[highlight=vbnet] If Not IsNothing(frmVoransicht) Then
                  CType(frmVoransicht.Controls("pb"), PictureBox).Image = Nothing
                  CType(frmVoransicht.Controls("wb"), WebBrowser).Url = Nothing
                  frmVoransicht.Dispose()
                  frmVoransicht = Nothing
                  End If
                  Try
                  My.Computer.FileSystem.DeleteFile(datei)
                  Catch ex As Exception
                  MsgBox("Die Datei kann derzeit nicht gelöscht werden: " + ex.Message, MsgBoxStyle.Critical, "Datei löschen ...")
                  End Try
                  [/highlight]

                  Nur ist das Handle immer noch auf der Datei, ich kann trotz allem nicht löschen. Auch nicht einige Sekunden später, falls das Freigeben der Ressourcen ein wenig dauern sollte. Wie kann ich diese Datei löschen?

                  Dave

                  Comment


                  • #10
                    Code:
                    CType(frmVoransicht.Controls("pb"), PictureBox).Image = Nothing
                    davor solltest du auch das Image disposen damit es direkt das File freigibt.

                    Code:
                    CType(frmVoransicht.Controls("pb"), PictureBox).Image.Dispose()
                    CType(frmVoransicht.Controls("pb"), PictureBox).Image = Nothing
                    Testen ob überhaupt ein Image da ist natürlich nicht vergessen. Wenn das Problem auch beim Webbrowser(eher nicht oder?) besteht bin ich grad mal überfragt.

                    PS. Nächstes mal Bitte neue Frage -> neuer Thread

                    Comment


                    • #11
                      Danke, Ralf, jetzt geht's. Der Webbrowser braucht scheinbar kein Freigeben der Ressourcen, vermutlich hält der eben auch seinen Finger nicht auf der Datei. Aber die Bilder werden freigegeben. Danke ...

                      Comment

                      Working...
                      X