2017-11-30 15 views
0

일부 타사 서버에서 파일을 다운로드하고 있으므로 각 파일에 대해 다운로드 완료 이벤트 (서버에서 적어도)를 얻을 수있는 방법이 없습니다. 약 20 개의 파일이 있습니다. 개별 파일이 다운로드 되 자마자 다른 위치로 복사해야합니다 (가능한 한 빨리해야합니다).이벤트를받은 후 1 초 동안 대처 파일을 지연시키는 방법은 무엇입니까?

새 파일이 도착했는지 확인하려면 ReadDirectoryChanges API를 사용하고 있습니다.

while (ReadDirectoryChangesW(
      hDir, /* handle to directory */ 
      &buffer, /* read results buffer */ 
      sizeof(buffer), /* length of buffer */ 
      TRUE, /* monitoring option */ 
      FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_FILE_NAME, 
      &bytesReturned, /* bytes returned */ 
      NULL, /* overlapped buffer */ 
      NULL)) /* completion routine */ 

{ 
    //do file copy after download completes 
} 

이제 다운로드가 완료 될 때 확신 할 수없는 문제가 있습니다. ReadDirectoryChanges에서 여러 이벤트가 발생합니다. 이벤트가 발생하면 파일에 이벤트가 기록됩니다.

이벤트가 발생하는 특정 파일에 대한 다운로드가 완료되었음을 알 수있는 방법이 있습니까?

해결 방법으로, 우리는 복사를 시작하기 전에 1 초 동안 기다리기로 결정했습니다. 하지만 1 초가 지나면 다른 알림을 받으면 다른 1 초를 기다려야합니다.

우리는 별도의 스레드에서 파일 복사를 시작하고 여러 파일 복사가 동시에 발생할 수 있습니다.

이제 1 초를 추적하는 데 사용할 수있는 데이터 구조가 있고 그 사이에 다른 이벤트가 발생하면 1 초로 다시 시작해야합니까? 처음에는 우선 순위 대기열을 생각했지만 시간 제한이 발생했는지 여부를 10ms마다 확인해야합니다. 또한 여러 요소가 우선 순위 큐에 추가되면 파일을 다시 복사 할 수있는 문제가 있습니다.

아마도이 문제를 해결하기위한 나의 방법은 완전히 터무니 없습니다. 나는 더 나은 접근 방식에 개방적이다.

+1

어쩌면 파일 잠금 상태를 확인하여 다운로드가 완료되었는지 확인할 수 있습니다. 지연에 대한 은 WaitableTimer와 비슷할 것입니다. –

답변

2

파일에 대해 FILE_ACTION_MODIFIED 이벤트를받은 직후 공유 쓰기를 거부하면서 파일을 열어보십시오.하지만 공유 읽기는 허용됩니다. 다른 프로세스에서 파일을 쓰기 위해 열어두면 열 수 없으므로 다음 이벤트를 기다리십시오.