I was looking for a function to find the username locking a file.
I found this one which works fine:
Function GetUsername(fileDir As String, fileName As String) As String
'On Error Resume Next
Dim secUtil As Object
Dim secDesc As Object
Set secUtil = CreateObject("ADsSecurityUtility")
Set secDesc = secUtil.GetSecurityDescriptor(fileDir & fileName, 1, 1)
GetUsername = secDesc.Owner
End Function
I wanted to change
Set secDesc = secUtil.GetSecurityDescriptor(fileDir & fileName, 1, 1)
For
Set secDesc = secUtil.GetSecurityDescriptor(fullFileName, 1, 1)
I made the required change at the function declaration, even tried without any function but couldn't make the method work with a unique variable containing the full path, forcing me to split it for a reason I don't understand.
Here are the full function (well translated I hope)
Function GetUsername(fileDir As String, fileName As String) As
String 'case 1
'Function GetUsername(fullFileName As String) As String 'case 2
Dim secUtil As Object
Dim secDesc As Object
Set secUtil = CreateObject("ADsSecurityUtility")
Set secDesc = secUtil.GetSecurityDescriptor(fileDir & fileName, 1, 1) 'case 1
'Set secDesc = secUtil.GetSecurityDescriptor(fullFileName, 1, 1) 'case 2
GetUsername = secDesc.Owner
End Function
Function IsOpen(file As String) As Boolean
Dim filenum As Integer, errnum As Integer
On Error Resume Next
filenum = FreeFile()
Open file For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
IsOpen = False
Case 70
IsOpen = True
Case Else
Error errnum
End Select
End Function
Function CheckFile(file As String) As Boolean
'existence test
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.fileexists(file) = True Then 'the file exists
If IsOpen(file) = True Then 'the file is open
MsgBox "file opened" & Chr(10) & "By : " & GetUsername("R\", "TEST.xlsx") 'case 1 : works
'MsgBox "file opened" & Chr(10) & "By : " & GetUsername(file) 'case 2 : don't works
Else
MsgBox "closed file"
End If
Else
MsgBox "ERROR: The file does not exists"
End If
End Function
Private Sub TestOpen()
Dim ftest As String
ftest = "R:\TEST.xlsx"
CheckFile (ftest)
End Sub
The documentation for
GetSecurityDescriptorseems rather emphatic that the first parameter must be a variant.I tried your revised code and sure enough it did not work. However, after making one small change to force the parameter to variant the code worked fine.
So what is the difference between case 1 and case 2 from your question? I don't know. But it seems the result of concatenating 2 strings is a variant which is why case 1 worked.