Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

filesystemobject - movefile und deletefile scheitern (access denied)

Begonnen von drnicolas, September 22, 2024, 12:15:07

⏪ vorheriges - nächstes ⏩

drnicolas

Ich versuche eine Datei mit dem filesystemobject zu verschieben.
Leider scheitert das mit "Access denied"

Interessanterweise kann ich das umgehen:
Wenn die Routine scheitert lande ich im VB-Editor und kann die problematische Zeile dann mit F8 doch noch ausführen.

An sich soll diese Routine als Teil einer .accde-Datei ausgeführt werden - es gibt dort also keine Möglichkeit die Zeile nochmals auszuführen.

Weitere Infos:
Zuvor wurde die zu verschiebende Datei im Webcontrol angezeigt (es handelt sich immer um PDFs)

Bevor ich die Datei verschiebe, setze ich die Quelle des Controls mit .Navigate "about:blank" um zu vermeiden, dass die Datei immer noch geöffnet ist

Ich habe auch schon probiert eine Verzögerung von ca. 1000ms vor dem Verschieben einzufügen - ohne Besserung

Das Problem "access denied" scheint häufiger aufzutreten.
Any ideas ?

Knobbi38

Kannst du bitte mal deinen Code posten?

Hast du schon mal die File-Methoden probiert?
Prüfe vor dem ausführen der entsprechenden Zeile mit dem Process-Explorer von Sysinternals, ob die Datei noch von einem anderen Process verwendet wird.

drnicolas

HIer kommt ein Teil des Codes.

Die Aufgabe ist etwas komplex. Andere Routinen versuchen in Dokumenten (PDF) Personalien zu erkennen und diese in der Patienten-Datenbank zu finden.

Falls das nicht klappt, landen die Dokumente in einem speziellen Verzeichnis '_nicht_zugeordnet' und einer temporären Tabelle.

Man wählt dann manuell einen Patienten aus. Der Code soll dann das Dokument aus dem Verzeichnis nach woanders verschieben

Me.ctl_Doku.Object.Navigate "about:blank"
   
    If Me.txt_Ergaenzungstext = "" Or IsNull(Me.txt_Ergaenzungstext) Then
        MsgBox "Bitte geben Sie eine kurze Beschreibung des Dokuments ein!", vbExclamation + vbOKOnly, _
            "Dokument nachträglich zuordnen ..."
        Me.txt_Ergaenzungstext.SetFocus
        Exit Sub
    End If
   
    filename = Me.lst_nicht_zugeordnet.Column(1)
   
    If Me.txt_PatID = "" Then
        MsgBox "Es wurde kein Patient ausgewählt!", _
            vbExclamation + vbOKOnly, "Dokument nachträglich zuordnen ..."
        Exit Sub
    End If
   
    DoCmd.Hourglass 1
    PK_Pat = Me.txt_PatID
   
    'neuen Dateinamen generieren
   
    ' hier wird ein neuer Dateiname generiert
' filename ist der originale Name,  new_filename der neue

    Set f = fs.GetFile(filename)
   
    Call sSleep(500)
   
    'fs.MoveFile filename, new_filename
    fs.CopyFile filename, new_filename, True
    Call sSleep(1500)
    'MsgBox f.Attributes, vbOKOnly, "Test"
   
    fs.DeleteFile filename, True
   

Aktuell versuche ich mit Copy - Verzögerung - Delete hinzukommen

Knobbi38

Wenn Filename und New_Filename korrekte, absolute Filenamen sind und die Datei nicht im Zielverzeichnis existiert, sollte das eigentlich funktionieren.

Wie gesagt, Zugriffsrechte und File-Looks mußt du natürlich prüfen.

drnicolas

#4
Leider nicht.
Ich ende immer an der Fehlermeldung zum LÖschen - egal ob ich das mit fs.deletfile oder einfach mit kill probiere.
An dem ENtwicklungsrechner kann ich dann einfach mit F5 fortsetzern und es funktioniert.

Es ist wie verhext. Als ob trotz meiner Anweisung "about:blank" immer noch die Datei im Zugriff ist und gesperrt bleibt.
EDIT:
ProcessExplorer sagt, dass zum Zeitpunkt des "Zugriff verweigert" noch immer Adobe ACrobat Reader läuft.
Klicke ich "debuggen" verschwindet der AcrobatReader.

Es scheint also möglicherweise an meiner Methode zu liegen wie ich das PDF in einem Control anzeigen lasse

Gibt es da was elganteres als das Web-Control

Knobbi38

Es geht nicht darum, welcher Prozess läuft, sondern welcher Prozess die Datei noch im Zugriff hat, so daß sie nicht gelöscht werden kann. Wenn die Datei nur verzögert freigegeben wird, mußt du in einer Schleife versuchen, selber einen exklusiven Zugriff zu erhalten. So bald das erfolgreich ist, wird die Datei wieder freigegeben und  kann danach verschoben werden.

Stellt sich noch die Frage, warum eine PDF Datei überhaupt in einem Steuerelement dargestellt werden muß. Andere Programme vertrauen auch auf der Darstellung in dem Standardprogramm.


drnicolas

Ich komme nochmal darauf zurück:

Ich stelle die PDF über ein Webcontrol dar und zwar mit control.Object.Navigate pfad

Ich versuche vor dem löschen oder verschieben den Zugriff des Webcontrols zu beenden, indem ich als Pfad "about:blank" darstellen lasse.

Damit verschwindet definitiv die Darstellund der PDF.

Allerdings scheint damit das Control nicht loszulassen.

Ich habe jetzt mal vesucht mit eine Schleife den Fehler 70 abzufangen und dann jeweils 1 sekunde zu warten - selbst mit 100s Wartezeit reicht es nicht.

Wenn ich aber den Code anhalte im vba-Editor, dann kann ich fortsetzen und es funktioniert sofort.

Knobbi38


drnicolas

Mein Workaround:
- Ich setze den Inhalt des Webcountrols auf about:blank
- Anschliessend lasse ich eine Meesagebox anzeigen
- Danach funktioniert der Vorgang delete/move