2016-09-21 6 views
0

내 소프트웨어 (VB6로 작성)는 커질 수있는 CSV 파일을 가져와야합니다. 사용자는 복사/붙여 넣기를 사용하여 파일을 입력 폴더에 저장합니다.
처리하기 전에 내가 읽고 싶은 파일이 완전히 복사되었는지 어떻게 알 수 있습니까?VB6 - 파일을 검색하는 방법은 외부 소스에서 복사가 완료되었습니다.

것들 내가 시도 :

  • 는 초 경간 GetFileSizeString 비교 : 나는 파일을 그냥 복사하기 시작했다하더라도 최종 값을 얻을 작동하지 않습니다.
  • FileSystemObject.DateLastModified : 같은
  • FileSystemObject.DateLastAccessed : 같은
  • FileLen : 같은
  • FileDateTime : 같은

편집 - (주석)에서 추가 삼바/리눅스 정보 :

Samba/Linux에서 처리하는 데 어려움을 겪고 있습니다. 이유는 모르겠지만 Samba가 파일을 복사 할 때 읽기 전용 속성은 중요하지 않습니다.

+2

파일을 읽기 전용으로 여는 것이 좋습니다. 복사 프로세스가 파일을 읽기 - 쓰기로 열어서 읽기만 열면 실패합니다. 열기가 성공할 때까지 (복사가 완료 될 때까지) 재 시도하십시오. – MarkL

+0

이것은 Windows에서 작동하지만 슬프게도 다루기 힘든 경우는 Samba/Linux에서 발생합니다. 이유는 모르겠지만 Samba가 파일을 복사 할 때 읽기 전용 속성은 중요하지 않습니다. – nivolas

+0

디렉터리 변경 알림 (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

답변

0

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 
0

내가 할 때 계산하는 작업을하기 위해 FileDateTime 기능을 사용 날짜와 파일이 생성 또는 마지막으로 수정하는 시간을 나타내는 날짜/시간 값입니다.

파일 시스템 사용에 대한 자세한 내용은 HERE을 참조하십시오.

위 구문에서 pathname은 유효한 경로 (드라이브를 선택적으로 포함 할 수 있음)를 지정하는 문자열 식입니다. drive는 드라이브 문자를 지정하는 문자열 식입니다. filespec, oldfilespec 및 newfilespec은 파일을 지정하는 문자열 표현식입니다 (드라이브 및 경로를 선택적으로 포함 할 수도 있음).

기능

설명

FileDateTime

구문

:

(모두가 성명 않은 setattr 제외 기능입니다) 파일을 사용할 수있는 함수의 집합입니다 다음

파일을 만들거나 마지막으로 수정 한 날짜와 시간을 나타내는 날짜/시간 값을 반환합니다. FileDateTime (스펙)

GetAttr 는 파일, 디렉토리의 속성을 나타내는 정수 또는 폴더를 돌려줍니다 GetAttr (스펙)

않은 setattr 당신이 파일 않은 setattr의 속성을 지정할 수 있습니다 문 (스펙 , 특성)

CurDir $ (또는 CurDir) 지정한 디스크 드라이브의 현재 경로를 나타내는 문자열을 반환합니다. 오른쪽에있는 구문에서, 여기서 DriveName은 유효한 디스크 드라이브 문자를 지정하는 문자열 식입니다

CURDIR $ 디렉터리를 파일이나 디렉토리 일치하는 특정 조건을 나타내는 캐릭터 라인을 돌려줍니다 (여기서 DriveName) 디렉터리 $ (또는 DIR) $ (filespec [, attributes])

FileLen 파일의 길이를 바이트 단위로 지정하는 Long을 반환합니다. FileLen 함수가 호출 될 때 지정된 파일이 열려 있으면 반환 된 값은 파일을 열기 직전의 파일 크기를 나타냅니다. FileLen (경로 이름)

LOF Open 문을 사용하여 연 파일의 크기를 바이트 단위로 나타내는 Long을 반환합니다. FileLen (filenumber)