Seite 1 von 3

Datenbank (Datei) löschen

Verfasst: 18.01.2022 13:17
von marcelx
Hallo,

ich habe ein seltsame Problem.
Ich möchte eine geöffnete Datenbank (Datei) löschen.

Ich schließe meine DB mit CloseDatabase(id) und lösche die Datei mit DeleteFile() was schief geht.

Mit Verwendung von FormatMessage() bekomme ich die Information
"Errorcode 20: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird"

Wie kann ich das lösen?

Danke und Gruß
MarcelX

Code: Alles auswählen

Procedure.s FormatMessage(ErrorCode)
  Protected *Buffer, len, result.s
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorCode,0,@*Buffer,0,0)
  If len
    result = "Errorcode " + Hex(ErrorCode) + ": " + PeekS(*Buffer)
    LocalFree_(*Buffer)
    ProcedureReturn result
  Else
    ProcedureReturn "Errorcode: " + Hex(ErrorCode)
  EndIf
EndProcedure 

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 13:40
von NicTheQuick
Kannst du einen Code posten, der das Problem tatsächlich aufzeigt? Ich bin zu faul selbst einen zu schreiben. Und du hast ja offensichtlich schon einen.

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 14:51
von marcelx
Mein code ist umfangreich.
Mit ein Durchlauf mit debug finde ich die Ursache nicht.

Mit diese Kurzfassung kann ich der Fehler wieder produzieren

Code: Alles auswählen

UseSQLiteDatabase()

Global DB

Procedure.s FormatMessage(ErrorCode)
  Protected *Buffer, len, result.s
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorCode,0,@*Buffer,0,0)
  If len
    result = "Errorcode " + Hex(ErrorCode) + ": " + PeekS(*Buffer)
    LocalFree_(*Buffer)
    ProcedureReturn result
  Else
    ProcedureReturn "Errorcode: " + Hex(ErrorCode)
  EndIf
EndProcedure 

Procedure DBCreate(Filename.s)
  Nr = CreateFile(#PB_Any,GetTemporaryDirectory()+Filename+".db")
  CloseFile(Nr)
  Debug GetTemporaryDirectory()+Filename+".db"
EndProcedure

Procedure DBOpen(Filename.s,User.s="",Pass.s="")
  DB = OpenDatabase(#PB_Any, GetTemporaryDirectory()+Filename+".db", User, Pass, #PB_Database_SQLite)
EndProcedure

Procedure DBClose()
  CloseDatabase(DB)
  DB=0
EndProcedure

fileName.s = "Test007"
DBCreate(fileName)
DBOpen(fileName)
Debug FileSize(GetTemporaryDirectory()+Filename+".db")
DBClose() ; ADD
If DeleteFile(GetTemporaryDirectory()+Filename+".db")
  Debug "OK"
Else
  Debug FormatMessage(GetLastError_())
EndIf

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 17:18
von TroaX
Ich habe das jetzt nur überflogen. Aber wo rufst du die Prozedur DBClose auf? Oder bin ich schon so müde, das ich das übersehe? o.O

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 18:06
von NicTheQuick
Abgesehen davon, dass GetLastError_() und Co bei mir unter Linux nicht existieren, krieg ich mit diesem Code ein "OK" zurück und die Datei wurde tatsächlich gelöscht. Das heißt ich kann den Fehler hier leider nicht reproduzieren. Das macht Windows wohl etwas anders als Linux.
Abgesehen davon, fehlt im Code tatsächlich das DBClose(), wie @TroaX bereits sagte.

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 18:39
von marcelx
Tatsächlich, in mein Test-Code hatte ich DBClose() vergessen (siehe ADD in mein Test-Code).
So funktioniert - aber nicht in mein gesamte code (mehr als 7000 Zeilen)

Wie kann ich die Ursache finden b.z.w erfahren welche Prozess zugreift?

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 18:44
von TroaX

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 19:00
von marcelx
Danke TroaX
mit resmon.exe sehe ich dass der Process PureBasicCompilation0.exe der zugriff hat.

Der Process-explorer muss ich runterladen

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 19:01
von NicTheQuick
marcelx hat geschrieben: 18.01.2022 18:39 Tatsächlich, in mein Test-Code hatte ich DBClose() vergessen (siehe ADD in mein Test-Code).
So funktioniert - aber nicht in mein gesamte code (mehr als 7000 Zeilen)

Wie kann ich die Ursache finden b.z.w erfahren welche Prozess zugreift?
Hast du mal ein kleines Delay for das DeleteFile gesetzt? Möglicherweise blockiert dein Virenscanner die Datei noch, weil er sie scannt. Ansonsten musst du mal mit dem Debugger arbeiten, ein paar Haltepunkte setzen und durchskippen, ob auch wirklich alles so ausgeführt wird wie du es dir vorstellst.

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 19:15
von marcelx
OK NicTheQuick
ich probiere mit ein Delay sonst mache ich morgen dran mit den Debugger