2010-07-22 2 views
1

공유 네트워크 드라이브에 최신 버전의 파일이있는 경우 시작시 응용 프로그램이 확인합니다. 네트워크 공유에있는 공유 폴더가 최신 폴더 인 경우 공유 폴더를 로컬 응용 프로그램 디렉터리에 복사하고 이전 공유 폴더를 덮어 씁니다. 이 작업을 수행하는 나의 현재 코드는 다음과 같이 진행됩니다 로그를 확인. NET에서 최신 파일을 덮어 씁니다.

FileInfo sourceFile = new FileInfo(source + "\\" + fileName); 
if(sourceFile.Exists) { 
    FileInfo destFile = new FileInfo(destination + "\\" + fileName); 
    if (destFile.Exists && destFile.LastWriteTime >= sourceFile.LastWriteTime) 
    { 
     //Using log4net 
     log.Info("Current " + fileName + " is newer than the one on the server."); 
     return false; 
    } 
} 

를, (이 경우 이벤트) 때때로 소스 파일의 LastWriteTime가 새로 감지되지 않는 것 같습니다. 아마도 시간을 쓰고 수정 한 시간을 혼란스럽게합니까? 아무도 이것을 달성하는 방법에 대한 아이디어가 있습니까?

EDIT (아래 내 코멘트 사본) : 내가 복사하는 파일은 대부분 내가 제어 할 수있는 DLL 파일입니다. 그것들은 "Windows 용 Growl"응용 프로그램을위한 어셈블리입니다. 사용자 정의 디스플레이를 정의합니다. 내 응용 프로그램의 의도는 네트워크 공유를 확인하여 사용 가능한 최신 버전이 있는지 확인하고 필요할 경우 로컬로 복사하는 것입니다. 그렇게하면 모든 고객이 최신 디스플레이를 사용하도록 할 수 있습니다.

편집 2 :

OK, 나는 어셈블리를로드 주변에 속지, 나는 또 다른 문제 다 퉜다. Assembly.ReflectionOnlyLoadFrom을 통해로드 된 다른 위치의 파일이라 할지라도 동일한 파일을 두 번로드 할 수없는 것 같습니다.

답변

1

docs for LastWriteTime 반환되는 값이 정확하지 않을 수 있습니다. Refresh 메서드에 대한 주석도 참고하십시오. 위의 코드에서는 FileInfo 객체를 만들고이 객체를 임의의 시간 동안 누르고 있으면이 메서드를 호출 할 필요가 거의 없습니다.

Windows는 파일의 실제 마지막 쓰기 시간 업데이트를 지연시킬 자유가 있습니다. 지연 될 수있는 기간은 파일 정보를 처리하는 Windows API 호출을 확인하십시오. MSDN 따르면

1

:

는 그 값이 연속적 운영 시스템에 의해 업데이트되지 않을 수 고유 함수를 사용하기 때문에이 방법은 부정확 값을 반환 할 수있다.

가능하면

, 나는 다음 중 하나를 시도 할 것입니다 :

  • 삽입 파일 이름
  • 저장 파일 내용의 파일 버전이나 날짜에 날짜를.

그런 식으로 LastWriteTime 속성과 관련된 문제는 걱정할 필요가 없습니다.

+0

저는 주로 DLL을 복사하기 때문에이 옵션이 아닙니다. 아마도 DLL의 빌드 시간에 대한 정보를로드하는 방법이 있습니까? – Anthony

+0

@Duracell - DLL에 관한 것이라면 최신 버전이든 최신 버전이든 현재 가지고있는 것과 다른지 여부가 중요합니까? IOW, 네트워크 공유에있는 DLL (있는 경우)이 정의에 의해 실행하려는 파일이 아닐까요? 분명히 여기에 당신의 프로세스에 대해 뭔가를 가정합니다 - 당신은 같은 DLL을 로컬로 구축하지 않습니다. – arootbeer

+0

조립품입니까? 너는 그들을 통제 할 수 있니? 그렇다면 아마도 AssemblyName.Version 속성이 유용 할 것입니다.그렇지 않으면 파일 자체에 대한 메타 데이터를 다른 파일이나 포함 된 폴더에 저장할 수 있습니다. 우리가 당신을 도울 때 사용할 수있는 문맥 정보가 더 있습니까? –