API를 사용하여 단독 액세스를 테스트하는이 방법을 사용했습니다. Windows 이외의 플랫폼에서이 소프트웨어를 사용해 본 적이 없기 때문에 결과가 다를 수 있습니다. 이것을 자주 사용되는 메소드의 모듈에서 사용하지만 API 호출, 유형 및 사용 된 상수가 포함되어 있다고 생각합니다.
Private Const ERROR_SHARING_VIOLATION = 32&
Private Const GENERIC_WRITE = &H40000000
Private Const INVALID_HANDLE_VALUE = -1
Private Const OPEN_EXISTING = 3
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Any) As Long
Public Function CanOpenExclusive(ByVal vFileName As String) As Boolean
Dim lngResult As Long
Dim udtSA As SECURITY_ATTRIBUTES
On Error GoTo errCanOpenExclusive
If Len(vFileName) > 0 Then
udtSA.nLength = Len(udtSA)
udtSA.bInheritHandle = 1&
udtSA.lpSecurityDescriptor = 0&
lngResult = CreateFile(vFileName, GENERIC_WRITE, 0&, udtSA, OPEN_EXISTING, 0&, 0&)
If lngResult <> INVALID_HANDLE_VALUE Then
Call CloseHandle(lngResult)
CanOpenExclusive = True
Else
Select Case Err.LastDllError 'some errors may indicate the file exists, but there was an error opening it
Case Is = ERROR_SHARING_VIOLATION
CanOpenExclusive = False
Case Else
GoTo errCanOpenExclusive
End Select
End If
End If
Exit Function
errCanOpenExclusive:
Err.Raise Err.Number, Err.Source & ":CanOpenExclusive", Err.Description
End Function
출처
2016-09-21 18:36:36
jac
파일을 읽기 전용으로 여는 것이 좋습니다. 복사 프로세스가 파일을 읽기 - 쓰기로 열어서 읽기만 열면 실패합니다. 열기가 성공할 때까지 (복사가 완료 될 때까지) 재 시도하십시오. – MarkL
이것은 Windows에서 작동하지만 슬프게도 다루기 힘든 경우는 Samba/Linux에서 발생합니다. 이유는 모르겠지만 Samba가 파일을 복사 할 때 읽기 전용 속성은 중요하지 않습니다. – nivolas
디렉터리 변경 알림 (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365261(v=vs.85).aspx) 구독을 조사하거나 변경 저널 (https : //msdn.microsoft.com/en-us/library/windows/desktop/aa363798(v=vs.85).aspx). 그러나 그 중 하나가 복사 작업이 완료된 시점에 대해 긍정적 인 알림을 제공하는지 여부는 알 수 없습니다. – MarkL