2014-07-16 4 views
1

현재 웹 서버에서 야간에 실행될 웹 사이트의 백그라운드 프로세스를 작성 중입니다.C#을 사용하여 파일을 덮어 쓴 경우 (이동 및 바꾸기)

내 주요 문제는 지난 24 시간 동안 이미지 파일이 변경되었는지 여부를 감지해야한다는 것입니다. 나는이 다음과 같은 코드를 사용하여 쉽게 달성 될 것이라고 생각 :

DateTime lastWrite = System.IO.File.GetLastWriteTimeUtc(HttpContext.Current.Server.MapPath(image.FileName)); 

if (lastWrite > DateTime.UtcNow.AddHours(-24) && lastWrite < DateTime.UtcNow) 
{ 
    var a = "This item has been modified"; 
} 
else 
{ 
    var b = "This item has not been modified"; 
} 

하지만,이 파일이 마지막으로 수정 된이는 나에게 날짜 시간을 줄 것으로 보인다. 이미지가 페인트와 같은 것을 사용하여 편집되었지만 수정 된 날짜와 기존 이미지의 잘라 내기 및 붙여 넣기를 사용하여 이미지를 덮어 썼는지 여부는 원래 이미지와 동일하게 유지되는지 여부를 알려주지 않습니다. 그 자리에.

내 질문에 따라서 파일 (주로 이미지)이 24 시간 내에 진정으로 수정 (편집, 복사, 제거, 대체)되었는지 어떻게 알 수 있습니까?

도움을 주시면 감사하겠습니다.

+0

잘라 내기 및 붙여 넣기를 처리하려면 GetCreationTimeUtc()를 사용하십시오. – CathalMF

+0

파일을 붙여 넣으려는 디렉토리에 이미 같은 이름의 파일이있는 경우 잘라 내기 및 붙여 넣기가 감지되지 않습니다. 이동 및 바꾸기 옵션을 사용하면 작성 시간이 변경되지 않습니다. – jezzipin

+0

파일에 플래그를 지정할 수있는 방법이 허용되면 NTFS 대체 데이터 스트림을 사용할 수 있습니다 (파일 자체에 숨겨진 플래그와 같으며 새 파일에있을 수 없음) – Xaruth

답변

2

이 장기 실행 페이지 응용 프로그램의 경우 이전 파일에 대한 정보가 들어있는 데이터베이스를 유지해야합니다. 이렇게하는 한 가지 방법은 각 파일의 MD5를 저장 한 다음 변경된 내용을 비교하고 복사하는 것입니다.

using (var md5 = MD5.Create()) 
using (var stream = File.OpenRead(filename)) { 
    return Convert.ToBase64String(md5.ComputeHash(stream)); 
} 

이 일부에 문제가 "가사가"필연적으로 일어날 것이다, 하룻밤 실행되지 않음을 의미하는 경우도 동기화 할 수있게의 추가 혜택이있다!

+0

이것은 지금까지 가장 좋은 대답 인 것 같습니다. 나는이 방법을 철저히 다른 시나리오를 사용하여 테스트했으며 절대적으로는 보이지 않는다. (거의) – jezzipin

0

아카이브 파일 속성을 사용하는 다른 소프트웨어가 없다면 필요에 따라 작동합니다. 파일을 다른 위치에 복사 한 후에는 아카이브 속성을 설정 해제하십시오. 다른 디렉토리에서 파일을 덮어 쓰면 다시 설정됩니다!

// Check for flag 
FileAttributes attributes = File.GetAttributes(path); 
bool isArchiveSet = (attributes & File.Archive) == File.Archive 

// Remove archive flag 
FileAttributes attributes = File.GetAttributes(path); 
attributes = attributes & ~FileAttributes.Archive; 
File.SetAttributes(path, attributes); 

(테스트되지 않은 코드, 당신은 문제가 제가 그것을 살펴 보겠습니다 알려 경우 -하지만 아카이브 비트의 동작을 테스트 한 당신이 그것을에 원하는 것을).

+0

이것은 내가 들여다 보았지만 불행하게도 작동하지 않는 첫 번째 물건 중 하나였다. 내가 시도한 시스템에 모든 이미지가 기본적으로 보관되어있는 것으로 보입니다. – jezzipin

+0

@jezzipin 모든 파일에 비트가 설정되어 있지 않다는 것을 의미하면 뭔가 다른 속성을 사용해야합니다 (이상한 방법이기 때문에 - Windows는 파일을 변경할 때마다 자동으로 비트를 설정하므로 사용자가 설정 한 경우 설정을 해제해야합니다. 당신의 사본을 가져 갔다). 아마도 당신은 그 소프트웨어를 사용하지 못하게하거나 당신의 일과 후에 즉시 실행되도록 설정할 수 있습니까? –

관련 문제