Diese Funktion legt fest, ob auf eine interessierende Datei im Schreibmodus zugegriffen werden kann. Dies ist nicht genau dasselbe wie zu bestimmen, ob eine Datei von einem Prozess gesperrt ist. Dennoch können Sie feststellen, dass es für Ihre Situation funktioniert. (Zumindest bis etwas Besseres herauskommt.)
Diese Funktion zeigt an, dass der Schreibzugriff nicht möglich ist, wenn eine Datei von einem anderen Prozess gesperrt wird. Diese Bedingung kann jedoch nicht von anderen Bedingungen unterschieden werden, die den Schreibzugriff verhindern. Beispielsweise ist der Schreibzugriff auch nicht möglich, wenn für eine Datei das schreibgeschützte Bit gesetzt ist oder restriktive NTFS-Berechtigungen vorhanden sind. Alle diese Bedingungen führen dazu, dass die Berechtigung verweigert wird, wenn ein Schreibzugriff versucht wird.
Beachten Sie außerdem, dass die von dieser Funktion zurückgegebene Antwort nur dann zuverlässig ist, wenn eine Datei von einem anderen Prozess gesperrt wird. So sind Nebenläufigkeitsprobleme möglich.
Eine Ausnahme wird ausgelöst, wenn eine der folgenden Bedingungen gefunden wird: 'Datei nicht gefunden', 'Pfad nicht gefunden' oder 'ungültiger Dateiname' ('falscher Dateiname oder ungültige Nummer').
Function IsWriteAccessible(sFilePath)
' Strategy: Attempt to open the specified file in 'append' mode.
' Does not appear to change the 'modified' date on the file.
' Works with binary files as well as text files.
' Only 'ForAppending' is needed here. Define these constants
' outside of this function if you need them elsewhere in
' your source file.
Const ForReading = 1, ForWriting = 2, ForAppending = 8
IsWriteAccessible = False
Dim oFso : Set oFso = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Dim nErr : nErr = 0
Dim sDesc : sDesc = ""
Dim oFile : Set oFile = oFso.OpenTextFile(sFilePath, ForAppending)
If Err.Number = 0 Then
oFile.Close
If Err Then
nErr = Err.Number
sDesc = Err.Description
Else
IsWriteAccessible = True
End if
Else
Select Case Err.Number
Case 70
' Permission denied because:
' - file is open by another process
' - read-only bit is set on file, *or*
' - NTFS Access Control List settings (ACLs) on file
' prevents access
Case Else
' 52 - Bad file name or number
' 53 - File not found
' 76 - Path not found
nErr = Err.Number
sDesc = Err.Description
End Select
End If
' The following two statements are superfluous. The VB6 garbage
' collector will free 'oFile' and 'oFso' when this function completes
' and they go out of scope. See Eric Lippert's article for more:
' http://blogs.msdn.com/b/ericlippert/archive/2004/04/28/when-are-you-required-to-set-objects-to-nothing.aspx
'Set oFile = Nothing
'Set oFso = Nothing
On Error GoTo 0
If nErr Then
Err.Raise nErr, , sDesc
End If
End Function
Darin stellt fest (in anderer Antwort), dass dieses Modul enthalten soll: 'Konst ForReading = 1, ForWriting = 2, ForAppending = 8' – Smandoli
@Smandoli - Vielen Dank für diese Auslassung, um meine Aufmerksamkeit zu bringen. Ich habe den Code entsprechend aktualisiert. Beachten Sie auch meinen Kommentar vor dem Setzen von 'oFile' und' oFso' auf 'Nothing' am Ende der Funktion. – DavidRR