Ta funkcja określa, czy dostęp do pliku będącego przedmiotem zainteresowania można uzyskać w trybie "zapisu". Nie jest to dokładnie to samo, co ustalenie, czy plik jest zablokowany przez proces. Mimo to może się okazać, że działa to w twojej sytuacji. (Przynajmniej dopóki nie pojawi się coś lepszego.)
Ta funkcja pokaże, że dostęp "zapis" nie jest możliwy, gdy plik jest zablokowany przez inny proces. Nie może jednak odróżnić tego warunku od innych warunków, które uniemożliwiają dostęp do zapisu. Na przykład dostęp "zapisu" nie jest również możliwy, jeśli plik ma ustawiony bit tylko do odczytu lub ma restrykcyjne uprawnienia NTFS. Wszystkie te warunki spowodują "odmowę zgody", gdy zostanie podjęta próba "zapisu".
Należy również zauważyć, że jeśli plik jest zablokowany przez inny proces, odpowiedź zwrócona przez tę funkcję jest niezawodna tylko w momencie, gdy funkcja jest wykonywana. Tak więc problemy z współbieżnością są możliwe.
Wyjątek jest zgłaszany, jeśli zostanie znaleziony dowolny z następujących warunków: "plik nie znaleziony", "ścieżka nie znaleziona" lub "nielegalna nazwa pliku" ("zła nazwa lub numer pliku").
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 zauważa (w innej odpowiedzi), że moduł ten powinien zawierać: 'Const ForReading = 1, ForWriting = 2, ForAppending = 8' – Smandoli
@Smandoli - Dziękuję za zwrócenie mojej uwagi na pominięcie. Zaktualizowałem kod odpowiednio. Zwróć także uwagę na mój komentarz poprzedzający ustawienie "oFile" i "oFso" na "Nic" na końcu funkcji. – DavidRR