Datenbank (Datei) löschen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Datenbank (Datei) löschen

Beitrag 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 
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Datenbank (Datei) löschen

Beitrag 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.
Bild
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenbank (Datei) löschen

Beitrag 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
Zuletzt geändert von marcelx am 18.01.2022 18:34, insgesamt 1-mal geändert.
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Datenbank (Datei) löschen

Beitrag 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
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Datenbank (Datei) löschen

Beitrag 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.
Bild
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenbank (Datei) löschen

Beitrag 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?
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Datenbank (Datei) löschen

Beitrag von TroaX »

PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenbank (Datei) löschen

Beitrag von marcelx »

Danke TroaX
mit resmon.exe sehe ich dass der Process PureBasicCompilation0.exe der zugriff hat.

Der Process-explorer muss ich runterladen
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Datenbank (Datei) löschen

Beitrag 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.
Bild
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenbank (Datei) löschen

Beitrag von marcelx »

OK NicTheQuick
ich probiere mit ein Delay sonst mache ich morgen dran mit den Debugger
Win-10, PB 5.31 (Windows - x86)
Antworten