DirectoryInfo / Ordner lässt sich nicht löschen

MasterDS

Erfahrenes Mitglied
Hallo zusammen!

Ich steh glaub ich grad auf dem Schlauch:

Code:
    Private Sub Close()
        Dim di As New IO.DirectoryInfo("C:\TEMP")

        di.Delete(True)
    End Sub

FEHLER:

Der Prozess kann nicht auf die Datei C:\TEMP zugreifen, da sie von einem anderen Prozess verwendet wird.


Ja Spinn ich? Der Ordner wird vorab vom Programm erstellt und es besteht kein Zugriff mehr drauf. Gibts das denn? :confused:
 
Hi

Ist das eine rhetorische Frage? :D
Der Ordner wird vorab vom Programm erstellt und es besteht kein Zugriff mehr drauf. Gibts das denn? :confused:
Wie erstellst du denn das Verzeichnis? Sicher das alle Referenzen auf das Verzeichnis weg sind?
Hast du es schon mal mit der Methode Directory.Delete probiert.
Mir scheint fast, dass du das Verzeichnis nämlich nicht löschen kannst, da die DirectoryInfo-Instanz die Finger darauf hält.
Wobei ich mir dann die Frage stelle, warum es diese Methode für die Klasse gibt :confused:
 
Hey,

also du Routinen die auf dem Verzeichnis arbeiten sind ja schon lange beendet, wenn diese aufgerufen wird. Dann müssten ja so oder so alle Objekte wieder Freigegeben sein. Oder irre ich? Dennoch habe ich immer alle Referenzen gekillt. Entweder mit Dispose oder XX = Nothing.

Und ja, Directory.delete() hab ich auch schon getestet. Ging auch nicht. Hab auch schon getestet vorab alle Dateien aus dem Verzeichnis zu löschen und dann den Ordner: Dateien werden gelöscht, aber der Ordner wirft immer noch den Fehler.

Komisch oder?
 
Hi

Dann schau doch mal mit Filemon, ob und wer darauf die Finger hält.
Ohne Source Code lässt sich jedoch nicht feststellen, ob du von deiner Seite aus wirklich alle Referenzen beendet hast.
 
Also ich komme nicht weiter.

ProcessMonitor kann mir auch nicht helfen. Da sehe ich zwar immer wenn zugegriffen wird, aber sehe nicht, wer grad auf dem Ordner aktiv ist.

Hier nochmal ein Codeausschnitt, aber ich denke der ist I.O.

Code:
Private Sub DatenbankKopieren()
        Dim di As New IO.DirectoryInfo(myDBPfad)

        Dim AlterDBName As String
        Dim NeuerDateiName As String
        Dim gefundenDateiname As String

        If IO.File.Exists(myDBPfad & myDBName) Then
            AlterDBName = myDBName.Split(".")(0)
            Dim Dateiliste As New List(Of IO.FileInfo)

            Dateiliste.AddRange(di.GetFiles())

            For Each Datei As IO.FileInfo In Dateiliste
                If Datei.Name.Length > AlterDBName.Length Then
                    gefundenDateiname = Datei.Name.Substring(0, AlterDBName.Length)

                    If gefundenDateiname = AlterDBName Then
                        'Ist eine der passenden Dateien
                        'Ordner erstellen
                        If Not IO.Directory.Exists("C:\TEMP\") Then _
                            IO.Directory.CreateDirectory("C:\TEMP\")

                        'Prüfen auf Dateinamenslänge und ext.
                        'Indexe brauchen nicht kopiert zu werden.
                        If Datei.Extension.Length = 3 Then
                            If AlterDBName.Length > 4 Then
                                myDBName = AlterDBName.Substring(0, 4) & "." & myDBName.Split(".")(1)
                                NeuerDateiName = AlterDBName.Substring(0, 4) & Datei.Extension

                                'Kopieren und umbenennen
                                Datei.CopyTo("C:\TEMP\" & NeuerDateiName, True)
                            Else
                                'Nur kopieren
                                Datei.CopyTo("C:\TEMP\" & Datei.Name)
                            End If
                        End If
                    End If
                End If
            Next

            di = Nothing
            myDBPfad = "C:\TEMP\"

        End If
    End Sub

Ausser dieser Routine, greift nur noch eine zu, welche die DBs ausliesst.

Code:
Sub Connect()
        Dim cnn As Odbc.OdbcConnection
        Dim Command As Odbc.OdbcCommand
        Dim Adapter As Odbc.OdbcDataAdapter

        'erst die Datenbank wegkopieren und ggf. Umbenennen
        DatenbankKopieren()

        Try
            cnn = New Odbc.OdbcConnection("Driver={Microsoft Paradox Driver (*.db )};DriverID=538;Fil=Paradox 5.X;DefaultDir=" & myDBPfad & ";Dbq=" & myDBPfad & ";")

            cnn.Open()
            Command = New Odbc.OdbcCommand("SELECT * FROM " & myDBName, cnn)
            Adapter = New Odbc.OdbcDataAdapter(Command)

            myDataTable = New DataTable
            Adapter.Fill(myDataTable)

            Command = Nothing
            Adapter.Dispose()
            cnn.Close()

            'Bereinigen und löschen
            Close()

            myStatus = "OK"
        Catch ex As Exception
            myStatus = "FEHLER"
            If Not IsNothing(ex.InnerException) Then
                RaiseEvent Datenbankfehler(ex.Message & vbNewLine & vbNewLine & _
                                           ex.InnerException.ToString)
            Else
                RaiseEvent Datenbankfehler(ex.Message)
            End If
        End Try
    End Sub

Auch hier wird alles geschlossen.

sonst greift nur noch die Routine zu, die den Ordner löschen soll. :confused::confused::confused:
 
Da es der Ordner C:\Temp ist kann es natürlich auch sein dass ANDERE Applikationen drauf und auf Dateien darin zugreifen, das muss bedacht werden.
 
Also ich hab jetzt alles Dispose'd was geht. ;-) Hat aber nix gebracht. Hab auch mal den Ordnernamen geändert, aber auch nix. Wär ja auch noch schöner wenn man einen Ordner erstellt und direkt ein anderes Prog die Finger drauf hat.

Ich könnte mir vorstellen, dass der Paradox-Db-Treiber irgendwie die Finger auf dem Pfad hat. Ich kopiere ja die Datenbanken temporär in den Ordner, damit an der originalen ja nix passiert. Und dann öffne ich die aus dem Tempverzeichnis. Vielleicht steht der Treiber da noch irgendwie drauf, wenn ich versuche das Verzeichnis zu löschen.

Auch im Closed-Event der Form geht nix.
 
Hallo Master,

kann es damit zusammenhängen das du nach dem Kopieren
deinen myDBPfad = "C:\TEMP\" auf das Verzeichnis verweist ?

Ansonsten würde ich deinen Code mal nach und nach kastrieren
bis das Löschen klappt und dann die Codeteile wieder hinzufügen,
bis du den Fehler hast.
Ich vermute aber auch das die Connection oder der ODBC Treiber
da die Hand noch drauf hält, obwohl es unlogisch ist.

Jens
 
Zurück