2011-03-31 4 views
2

응용 프로그램에 업데이트를 적용하는 데 사용할 프로그램을 작성하려고합니다. 응용 프로그램의 특성상 일부 파일은 (주로 IIS에 의해) 잠기고 File.Copy(target)을 사용하여 덮어 쓸 수 없습니다. 작업을 수동으로 수행 할 때 지원 팀은 종종 파일을 잠금 해제하는 Windows 탐색기를 사용하여 파일을 복사하여 새 파일을 복사합니다.잠긴 파일을 이동 후 복사 덮어 쓰기

Windows 탐색기로 작업 할 때 왜 작동하며 왜 그렇게 비참하게 실패합니까? 코드에서 그것을 할 때?

var source = "c:\\source.txt"; 
var target = "c:\\target.txt"; 
var temp = "c:\\temp\\fake-target.txt"; 

using (var lockedFile = System.IO.File.OpenWrite(target)) { 
    File.Move(target, temp) 
    File.Copy(source, target) 
} 

모든 제안은 다음과 같습니다 열리고 다음 덮어 쓰기를 시도 파일을 잠그는 단위 테스트와

File.Move(target, tempPath) 
File.Copy(source, target) 

: 내가 사용하고 코드에 의해

는 다음과 같은 약이다 큰. 도와 줘서 고마워.

+2

정확히 Windows 탐색기로 작업하는 것이 명확하지 않습니다. 분명히 Explorer는 또 다른 응용 프로그램이며 "미안해!"라고 말합니다. 잠긴 파일을 다른 파일처럼 이동/삭제하려고하면 오류가 발생합니다. – Jon

+0

사실 그것은 완전히 작동합니다. 파일을 삭제하려고 시도하면 실패하지만 파일을 이동하거나 이름을 변경하려고하면 파일이 성공합니다. 파일의 이름을 바꾼 후에는 잠긴 파일이 있던 위치로 새 파일을 복사 할 수 있습니다. 파일을 잠그는 응용 프로그램이 배타적으로 파일을 잠그는 것이 아니라 복사 작업을 막는 것일 수 있습니다. – smaclell

+1

@smaclell : 키를 누를 때까지 장치 테스트에서와 같이 파일을 잠근 다음 Explorer에서 그 파일을 처리하는 방법을 확인해보십시오. – Jon

답변

2

파일 이름이 잘못되었습니다. 추가 백 슬래시가 없습니다.

사용중인 파일의 이름을 바꾸면 해당 파일에 대해 메모리 매핑 된 파일이있는 파일에 사용할 수 있습니다. 프로세스에로드 된 .exe 및 .dll 파일과 같습니다. FileStream으로 여는 파일에는 작동하지 않습니다. 그것은 오히려 나쁘다. Windows는 파일이 닫힐 때 파일에 대한 메타 데이터를 업데이트 할 수 없다. 파일 크기 및 마지막으로 작성된 날짜와 같습니다.

업데이트를 적용하기에 충분해야하며 코드 조각은 단순히 동일한 작업을 충분히 에뮬레이션하지 않습니다.

2

잠긴 파일은 응용 프로그램이나 Windows 탐색기에서 이동할 수 없습니다. 소프트웨어가 실행되는 동안 업데이트를 수행하는 일반적인 방법은 모든 것을 임시 파일 (예 : program.exe.temp)에 쓰는 것입니다. 업데이트가 완료되면 응용 프로그램을 종료하고 모든 원본 파일을 임시 파일 (가능한 경우 작은 업데이터 프로그램 사용)으로 바꾸고 응용 프로그램을 다시 시작합니다. 이렇게하면 설치된 버전을 전혀 방해하지 않고 업데이트 프로세스를 취소 할 수 있습니다 (마지막 단계 이전까지).

1

차이점이 있습니다. 로컬에서는 없지만 원격에서는 벗어날 수 있습니다. 모든 OS가 그것을 허용하는 것은 아닙니다.