2011-02-11 3 views
6

좋아,이 작업을 시작하는 것은 엄격히 Windows 용이며 .NET을 통해 C++을 사용하는 것을 선호하지만 boost::filesystem에 반대하지는 않습니다. 그렇지만 스트레이트 Windows API를 피할 수 있다면 선호 할 수 있습니다.추가 처리를 위해 파일 복사가 완료된 시점을 확인하는 방법은 무엇입니까?

이제 시나리오를 변경할 수없는 다른 컴퓨터의 응용 프로그램은 백업을 만들고 추가 처리를해야하는 컴퓨터의 특정 디렉터리에 파일을 만들 것입니다. 현재 나는 약간의 응용 프로그램을 만들었습니다.이 응용 프로그램은 FindFirstChangeNotificationFindNextChangeNotification windows API를 사용하여 대상 디렉토리에서 변경 알림을 수신 대기합니다.

문제는 디렉토리에 새 파일이 만들어 졌을 때 알림을받을 수는 있지만 변경된 파일은 한 번만 알리고 특정 파일을 알려주지 않는다는 것입니다. 나는 ReadDirectoryChangesW을 보았지만 약간 더 구체적인 정보를 얻을 수 있다는 것을 제외하고는 같은 이야기입니다.

이제 디렉터리를 검사하고 잠금을 얻거나 파일을 열어 마지막 알림에서 변경된 내용과 추가 사용을 위해 사용할 수 있는지 여부를 확인할 수 있지만 큰 파일을 복사하는 경우이를 발견했습니다 파일이 조작 될 준비가되지 않아 처음에는 다른 알림을 얻지 못하므로 실제로 복사가 완료된 시점을 알 수있는 방법이 없습니다. 첫 번째 알림 이후에 계속 획득하려고 시도하지 않는 한 성공할 때까지 잠급니다.

내가 덜 생각할 수있는 유일한 다른 점은 일종의 토큰 파일 일 것입니다.하지만 처음부터 파일을 만드는 응용 프로그램에 대한 제어권이 없기 때문에 저는 ' 나는 그 일을 어떻게 할 것인지를 안다. 여전히 이상하지 않다.

제안 사항?

+0

백업 프로그램은 어떻습니까? –

답변

4

이것은 매우 일반적인 문제이며 쉬운 대답이 아닙니다. 잠금을 획득하는 것은 원격지에서 물건을 변경할 수없는 경우 가장 좋은 옵션 중 하나입니다. 또 다른 본 것은 간격이나 두 시간 동안 크기가 변하지 않을 때까지 간격으로 파일을 보는 것입니다.

다른 전략으로는 주 파일이 완료되면 트리거로 no-byte 파일을 쓰고 임시 디렉토리에 쓰고 전체 파일을 실제 대상으로 옮기는 방법이 있습니다. 그러나 신뢰할 수 있으려면이 문제를 제어하는 ​​발신자 여야합니다. 수신자는 디렉토리를보고 파일이 정리 될 때까지 대기해야합니다.

+0

필자는 파일 증가로 인해 시간 제한이라는 생각에 잠깐 놀랐지 만 잠금 요청보다 나빠 보였습니다. 어쩌면 폴링을 포함하지 않는 해결책이 있다는 사실에 순진하게 낙담 할 수도 있습니다. – AJG85

+1

문제는 로컬 OS가 성공적인 파일 끝과 중단되었거나 중단 된 복사본의 차이를 알 수 없으므로 시도하지 않습니다.중단 된 사본으로 인해 잠금이 손실되고 다시 시작할 때 파일이 이미 백업되었을 수 있으므로 잠금 메소드에 대한 폴링조차도 절대 안전한 것은 아닙니다. WMQ FTE는 내가 전문적으로 다루는 제품 중 하나이기 때문에 많은 플랫폼에서이를 볼 수 있습니다. 비범 한 문제로 밝혀졌습니다. –

+0

그 가능성에 대해서도 생각조차하지 못했습니다. – AJG85

2

ReadDirectoryChangesW가 가장 좋은 방법입니다. 각 파일 복사 작업에 대해 FILE_ACTION_ADDED 뒤에 FILE_ACTION_MODIFIED 알림이 있어야합니다. 마지막 FILE_ACTION_MODIFIED 알림에서 파일이 더 이상 복사 프로세스에 의해 잠기지 않아야합니다. 따라서 복사본의 각 FILE_ACTION_MODIFIED 후에 잠금을 얻으려고하면 복사가 완료 될 때까지 잠금이 실패해야합니다. 특별히 세련된 솔루션은 아니지만 파일 복사가 완료 될 때 사용할 수있는 알림이없는 것 같습니다.

+0

문제는 필자의 테스트에서 적어도 Windows 7에서 파일 시스템의 캐싱 메커니즘 인 것 같습니다. 나는'FILE_NOTIFY_CHANGE_CREATION' 직후에 하나의'FILE_NOTIFY_CHANGE_LAST_WRITE'를 얻습니다. 또한 복사가 완료되지 않은 경우에도 전체 크기로 대상 파일을 만드는 것처럼 보이므로 FILE_NOTIFY_CHANGE_SIZE 만 실행됩니다. 'ReadDirectoryChangesW'를 호출하여 알림을 잃지 않도록 작업자 스레드를 만들어야 할 수도 있지만,이 작업이 얼마나 오래 걸리는지와 함께 현재 구현에서도 둘 이상을 얻을 것으로 예상됩니다. – AJG85

+0

@ AJG85 관찰 결과가 정확합니다. 복사하는 동안 첫 번째 파일 크기가 설정되고 (적어도 탐색기별로) 데이터가 기록됩니다. –

0

파일을 닫으면 데이터를 처리 할 수 ​​있습니다. 맞습니까? 따라서 파일을 닫을 때 추적해야합니다. 이것은 파일 시스템 필터 드라이버를 사용하여 수행 할 수 있습니다. 직접 작성하거나 CallbackFilter 제품을 사용할 수 있습니다.

+0

파일 시스템 필터 드라이버에 대한 자세한 정보가있는 참조 링크가 있으므로 구현할만한 가치가 있는지 확인할 수 있습니까? 이것은 시스템 내부를 가로채는 것처럼 들리므로이 프로젝트의 시간 제약에 대한 노력의 범위를 넘어서게됩니다. – AJG85

+0

AJG85 실제로 자체 필터를 구현하려면 수개월이 걸릴 것입니다. 필터에 대한 정보는 다음과 같습니다. http://www.microsoft.com/whdc/driver/filterdrv/default.mspx –

관련 문제