[Access2010] Ordner lässt sich nicht mehr löschen

Liebe Experten,

beim Starten meiner Datenbank-Applikation wird ein temporärer Ordner angelegt, der beim Schließen wieder gelöscht werden soll. Das funktioniert auch, wenn von der Applikation heraus nicht auf den Ordner zugegriffen wird. Ich konnte das Problem in einer kleinen Demo-Datenbank nachvollziehen, die ich hier hochgeladen habe:

http://www.file-upload.net/download-7729648/TestData…

Beim Öffnen des Formulars frmTest wird das Verzeichnis C:\TempABCDE angelegt (in der Prozedur Form_Load). Wird das Formular geschlossen, wird in der Prozedur Form_Unload das Verzeichnis wieder gelöscht.

Betätigt man aber zwischenzeitlich den Button „Command0“, durch den ein Filedialog mit dem o. g. Verzeichnis geöffnet wird, lässt sich beim Schließen des Formulars der Ordner nicht mehr löschen. VBA meldet dann den Runtime Error 70: Permission denied. Auch mit dem Windows Explorer lässt der Ordner nicht mehr löschen, solange bis Access geschlossen ist.

Meine Vermutung ist, dass durch den File Dialog eine Art Sperre auf den Ordner gelegt wird. Nur weiß ich nicht, wie ich diese Sperre wieder aufheben kann. Kann mir jemand helfen oder eine Umgehungslösung nennen? Mit RmDir funktioniert es übrigens auch nicht.

Besten Dank im Voraus und viele Grüße

Matthias

http://www.file-upload.net/download-7729648/TestData…

Meine Vermutung ist, dass durch den File Dialog eine Art
Sperre auf den Ordner gelegt wird.

Hallo Matthias,

meine auch, in Verdacht habe ich „Set“.
Kannst du die Datei auch im Access 2000-Modus speichern
und hochladen?
Dann zeig mir hier zumindest die Codes.

Gruß
Reinhard

Hallo Reinhard,

vielen Dank für deine Antwort.

meine auch, in Verdacht habe ich „Set“.
Kannst du die Datei auch im Access 2000-Modus speichern
und hochladen?

Wie geht das? Unter „Datenbank speichern unter“ wird diese Option nicht angeboten (nur Format .accdb).

Dann zeig mir hier zumindest die Codes.

Ok, das geht. Hoffentlich kannst du damit was anfangen.

Option Compare Database
Const dirName = "C:\TempABCDE"
'References: Microsoft Office 14.0 Object Library
' Microsoft Scripting Runtime


Private Sub Command0\_Click()
 Dim f As Office.FileDialog
 Set f = Application.FileDialog(msoFileDialogFilePicker)
 f.InitialFileName = dirName
 f.Show
 Set f = Nothing

End Sub


Private Sub Form\_Load()
 If Len(Dir(dirName, vbDirectory)) = 0 Then MkDir (dirName)
End Sub

Private Sub Form\_Unload(Cancel As Integer)
 Dim fso As Scripting.FileSystemObject
 Set fso = CreateObject("Scripting.FileSystemObject")
 Dim f As Scripting.Folder
 Set f = fso.GetFolder(dirName)
 f.Delete (True)
 Set f = Nothing
 Set fso = Nothing
End Sub

Viele Grüße

Matthias

Hallo Matthias,

meine auch, in Verdacht habe ich „Set“.
Kannst du die Datei auch im Access 2000-Modus speichern
und hochladen?

Wie geht das? Unter „Datenbank speichern unter“ wird diese
Option nicht angeboten (nur Format .accdb).

wie, das geht nicht? Hab ich schon erwähnt daß ich von Access
keine Ahnung habe? Möglicherweise wichtig :smile:

Ich ging bei Access wie bei Word, Excel davon aus daß da MS
bei/ab der Einführung der Version 2007 (für PC, Mac hat andere
Nummern) in den Speicheroptionen anbietet die Datei
im sogenannten 97-2003er Modus zu speichern.

Das geht bei Access nicht oder ist eine accdb etwas was davon
unbetroffen ist?

Mein Access 2000 konnte damit jedenfalls nix anfangen, unbekanntes
Dateiformat…

Dann zeig mir hier zumindest die Codes.

Ok, das geht. Hoffentlich kannst du damit was anfangen.

Ich glaub nicht. „Set“ hatte ich im Verdacht, aber bei flüchtiger
erster Überschau sehe ich daß da brav Set xyz=nothing benutzt
wird.

So Peanuts machen mir aber nix aus denn ich habe schon wieder
einen Verdacht, diesmal hoffentlich zielführender *gg*
Ich habe den großen Verdacht es ist für dich sehr hilfreich
hier den Mod oder den w-w-w Support zu kontaktieren
und um Verschiebeung in’s Access-Brett zu bitten.

Gruß
Reinhard

Hallo Reinhard,

Wie geht das? Unter „Datenbank speichern unter“ wird diese
Option nicht angeboten (nur Format .accdb).

wie, das geht nicht? Hab ich schon erwähnt daß ich von Access
keine Ahnung habe? Möglicherweise wichtig :smile:

Ich ging bei Access wie bei Word, Excel davon aus daß da MS
bei/ab der Einführung der Version 2007 (für PC, Mac hat andere
Nummern) in den Speicheroptionen anbietet die Datei
im sogenannten 97-2003er Modus zu speichern.

leider nein. Das Problem hatte ich mit Access 2000 auch ständig.
Ich habe mit dem ‚Visual data Manager‘ von VB6 *.mdb erzeugt, und die gelegentlich mit Access 97 bearbeitet. Mit Access 2000 lassen sich die nicht öffnen. Beide haben die Endung .mdb, aber Access 97 unterstützt noch DAO und ADO, Access 2000 nur noch ADO.

Access war also noch nie abwärtskompatibel. :smile:

Gruß Rainer

Wohl kein Access-Problem
Hallo Reinhard!

Ich habe den großen Verdacht es ist für dich sehr hilfreich
hier den Mod oder den w-w-w Support zu kontaktieren
und um Verschiebeung in’s Access-Brett zu bitten.

Vielen Dank für den Tipp. Allerdings habe ich den Eindruck, dass es sich hier nicht um ein typisches Access-Problem handelt: es hat ja nichts mit der Datenbank zu tun, sondern mit Office- bzw. Windows-Funktionalität (FileDialog, FileSystemObject). Ich werde mich wohl weiter auf die Suche machen müssen. Trotzdem vielen Dank für deine Hilfe.

Viele Grüße

Matthias

Vielen Dank für den Tipp. Allerdings habe ich den Eindruck,
dass es sich hier nicht um ein typisches Access-Problem
handelt: es hat ja nichts mit der Datenbank zu tun, sondern
mit Office- bzw. Windows-Funktionalität (FileDialog,
FileSystemObject). Ich werde mich wohl weiter auf die Suche
machen müssen. Trotzdem vielen Dank für deine Hilfe.

Hallo Matthias,

@Rainer, danke für deine Antwort.

Ich glaube liegt am FilePicker … Show.

In dem Moment wo du die Form schließt ist es denn noch
sichtbar?

WEnn nicht, ist es terminiert oder nur verdeckt?

Sponantan, leg doch zum Testen in einem Modul eine Variable an
Public weg as Boolean

In deiner Prozedur Command… unterhalb von
…= Nothing
schreibst du
weg=true

Dann pruef das ma in der Unload-prozedur ab…

Gruß
Reinhard

Moin, Matthias,

das muss so sein (nicht nur unter Windows): Das Betriebssystem erkennt, dass jemand auf dem Ordner sitzt und lässt sich ihn deshalb nicht unter dem Hintern wegziehen.

Es gibt spezielle Programme, zu finden unter dem Suchbegriff Unlocker, die diesen Mechanismus gezielt umgehen. Ob die sich aus einer Anwendung heraus aufrufen lassen, weiß ich leider nicht.

Gruß Ralf

handelt: es hat ja nichts mit der Datenbank zu tun, sondern
mit Office- bzw. Windows-Funktionalität (FileDialog,
FileSystemObject). Ich werde mich wohl weiter auf die Suche
machen müssen. Trotzdem vielen Dank für deine Hilfe.

Hallo Matthias,

nachstehend sind die Codes als ich das in einer Userform in
Excel 2007 nachbaute.
Excel-Vba kennt da andere Ereignisse als
Userform_UnLoad() was deinem Form_UnLoad entsprechen würde.
Ich hab dafür einen Commandbtn. genommen mit dem Befehl
Unload Userform3.

Ich bekam auch den Fehler „Zugriff verweigert“ bei
f.Delete
Mit On Error Resume Next war der Fehler schon weg.

Aber bei Prüfung auf Vorhandensein mittels MsgBox
vor und sehr spät nach f.Delete war/ist f immer noch da.
DoEvents brachte auch nix.

Zu Ralfs Idee, schau mal hier:
https://www.google.de/#sclient=psy-ab&q=free+vba+unl…
Da findeste unlocker die Dateien/Ordner „befreien“.

Ansonsten findest du bei unlock(er) [zu] viel zum Dietrich basteln
für Kennwortschlösser :smile:

Gruß
Reinhard

Option Explicit

Const dirName = "K:\ABCDEF"

'References: Microsoft Office 14.0 Object Library
' Microsoft Scripting Runtime

Private Sub CommandButton1\_Click()
 Dim f As Office.FileDialog
 Set f = Application.FileDialog(msoFileDialogFilePicker)
 f.InitialFileName = dirName
 f.Show
 Set f = Nothing
DoEvents
End Sub

Private Sub CommandButton2\_Click()
 Dim fso As Scripting.FileSystemObject
 Dim f As Scripting.Folder
 Unload UserForm3
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set f = fso.GetFolder(dirName)
 MsgBox Dir(dirName, vbDirectory)
' MsgBox Len(Dir(dirName, vbDirectory)) = 0
 On Error Resume Next
 f.Delete (True)
 Set f = Nothing
 Set fso = Nothing
 DoEvents
 MsgBox Dir(dirName, vbDirectory)
 'MsgBox Len(Dir(dirName, vbDirectory)) = 0
End Sub

Private Sub UserForm\_Activate()
 If Len(Dir(dirName, vbDirectory)) = 0 Then MkDir (dirName)
End Sub

Hallo Ralf,

erst mal vielen Dank für deine Antwort.

das muss so sein (nicht nur unter Windows): Das Betriebssystem
erkennt, dass jemand auf dem Ordner sitzt und lässt sich ihn
deshalb nicht unter dem Hintern wegziehen.

Gibt es keine Möglichkeit, mit Bordmitteln den Ordner selbst wieder freizugeben, ohne dass das Programm geschlossen werden muss? FileDialog und FileSystemObject scheinen keine solchen Methoden anzubieten.

Es gibt spezielle Programme, zu finden unter dem Suchbegriff
Unlocker , die diesen Mechanismus gezielt umgehen. Ob die sich
aus einer Anwendung heraus aufrufen lassen, weiß ich leider
nicht.

Danke für den Hinweis, aber das ist mir dann doch zu unsicher.

Viele Grüße
Matthias

Hallo Reinhard,

vielen Dank, dass du dir mit meinem Problem so viel Mühe gemacht hast und es nachvollziehen konntest. Das mit dem „Unlocker“ ist interessant, kann ich aber im Firmenumfeld nicht einsetzen. Es wäre mir lieber, wenn es da Windows-Bordmittel gäbe, die das tun. Leider scheinen ja die Klassen FileDialog und FileSystemObject keine Methoden zu haben, die einen geöffneten Ordner wieder freigeben. So muss ich wohl damit leben und das temporäre Verzeichnis einfach stehen lassen.

Mit On Error Resume Next war der Fehler schon weg.

Ok, aber damit übergehst du ihn ja einfach.

Aber bei Prüfung auf Vorhandensein mittels MsgBox
vor und sehr spät nach f.Delete war/ist f immer noch da.

Was meinst du mit noch da? War das Objekt noch da oder der Ordner im Dateisystem?

DoEvents brachte auch nix.

Das verstehe ich auch nicht. Was meinst du mit DoEvents?

Viele Grüße

Matthias

Moin, Matthias,

Kannst du die Datei auch im Access 2000-Modus speichern
und hochladen?

der Bitte möchte ich mich anschließen.

Wie geht das?

Früher mal

Extras > Datenbank-Dienstprogramme > Datenbank konvertieren > in vorhergehende Version …

Gruß Ralf

Testdatenbank im Access-2000-Format
Hallo Ralf!

der Bitte möchte ich mich anschließen.

Ich habs gefunden! Hier die Testdatenbank im Access-2000-Format (aber ohne Gewähr, dass sie funktioniert, weil ich sie nicht testen konnte).

http://www.file-upload.net/download-7739615/TestData…

Viele Grüße

Matthias

Vergeblich :frowning:
Hi,

FileDialog ist in A2000 unbekannt, den gab es da noch nicht.

Tut mir leid, ist mir nicht gleich aufgefallen - vor Jahren habe ich mal einen Ersatz dafür gesehen, nachgebaut mit APIs.

Gruß Ralf

Re: Vergeblich :frowning:
Hallo Ralf, Matthias,

FileDialog ist in A2000 unbekannt, den gab es da noch nicht.

ja, dann hatten wir sicher beide gleich beim Dim 'ne Fehlermeldung.
@Matthias, kannst du bitte mal die DLL die hinter
MSO 14.0 Object Libraray steckt hier hochladen?
Gelegentlich klappt das die in die ältere Version als
Verweis „einzubauen“.

Ich bezweifle aber inzwischen daß uns das weiterbringt.
Dann könnt ja FileDialog funktionieren, aber „Zugriff verweigert“
wird wohl kommen.

Und da hatte Matthias sehr recht, das ist kein Accessproblem,
das betrifft Gesamt Vba, VB auch, usw.
In Excel 2007 funktioniert ja mein Nachbau deines Codes und
auch die Fehlermeldung kommt.

Da ich persönlich ja auch wissen will wie ich Ordner/dateien
löschen kann wenn da der Zugriff verweigert wird erkundige ich
mich mal bei denen die Excel-Vba können.
Mal schauen was kommt…

Tut mir leid, ist mir nicht gleich aufgefallen - vor Jahren
habe ich mal einen Ersatz dafür gesehen, nachgebaut mit APIs.

Kann es sein daß ich da gestern drüber gestolpert bin, ein
Klassenmodul was im Namen FileDialog hatte und aus wenigen
APIs, so 3-5 bestand, lange Konsantendeklaration, vielen
Property Get und Property Let usw.?

Mal schauen ob ich das wiederfinde.
Andrerseits steckt das o.ä. Code sicher auch in
knowhow.mdb Version3
Zumindest steht in der langen Liste auch:
„Beispiel: Wie verwende ich das Klassenmodul FileDialog
(Vordefiniert für mdb und doc) ?“

Gruß
Reinhard

Toyota Nichts ist unmöglich :smile: Zugriff verweigert

Da ich persönlich ja auch wissen will wie ich Ordner/dateien
löschen kann wenn da der Zugriff verweigert wird erkundige ich
mich mal bei denen die Excel-Vba können.
Mal schauen was kommt…

Hallo Interessierte,

ein netter Thorsten schrieb mir das:

"Nach Klick auf den Explorer-Button + Anzeige des Ordners im
Windowsexplorer „hält“ Windows sozusagen den Zeiger auf den
ausgewählten Ordner, hier „K:\ABCDEF“ - und verweigert jeden
schreibenden Zugriff (Löschen ist auch Schreiben).

Ändere deinen Code mal wie folgt:
ChDir „C:“
f.Delete (True)

In diesem Fall gibt Windows die „Kontrolle“ über „K:\ABCDEF“ ab, und
du kannst damit wieder machen, was du willst."

In meinem Excel-Nachbau Matthias Codes funktionierte es.
In Access auch?

Gruß
Reinhard

Super, funktioniert auch mit Access!
Hallo Reinhard,

das ist ja eine super Erklärung, die der nette Thorsten da geschrieben hat, und wie zu erwarten (weil es ja ein Windows-Problem ist) funktioniert die Lösung auch mit Access.

Mir wäre zwar so etwas wie „f.Close“ oder „f.Release“ lieber gewesen, um den Ordner wieder zum Schreiben freizugeben zu machen, aber Windows funktioniert da wohl anders – aber Hauptsache es funktioniert.

Vielen Dank an Reinhard, den netten Thorsten (unbekannterweise) und alle anderen, die an diesem Thread beteiligt waren.

Viele Grüße

Matthias

Ich zitiere die Lösung von Thorsten hier nochmal, falls jemand später mal auf diesen Artikel stößt:

"Nach Klick auf den Explorer-Button + Anzeige des Ordners im
Windowsexplorer „hält“ Windows sozusagen den Zeiger auf den
ausgewählten Ordner, hier „K:\ABCDEF“ - und verweigert jeden
schreibenden Zugriff (Löschen ist auch Schreiben).

Ändere deinen Code mal wie folgt:
ChDir „C:“
f.Delete (True)

In diesem Fall gibt Windows die „Kontrolle“ über „K:\ABCDEF“
ab, und
du kannst damit wieder machen, was du willst."