2010-04-20 2 views
6

어쨌든 XMLDocument.Save()를 사용하여 만든 파일을 모니터링하는 다른 프로세스가 부분 파일을 발견 할 수 있습니까? Save()가 기존 파일을 덮어 쓰는 경우 어떤 차이가 있습니까?XMLDocument.Save는 원자 연산입니까?

답변

7

이와 같이 저장하면 아무런 문제가 없어야합니다.

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) 
{ 
    xmlDoc.Save(file); 
} 
+0

약 3 초 동안 펀치에 맞 춥니 다. upvote가 :) –

2

나는 원 자성을 보장하지 않는다고 생각합니다. 당신은 그것에 의존해서는 안됩니다.

+0

임시 파일을 저장하고 이름을 바꾸는 것은 어떨까요? 이름 바꾸기가 원자 적으로 수행 될 수 있습니까, 아니면 파일 시스템이 이런 방식으로 작동하지 않습니까? –

+0

나는 이름 바꾸기가 그 일을 할 것이라고 생각할 것이다. 그것은 당신이 원하는 "보증"의 정도에 달려 있습니다. "진짜"보장을 원한다면, 문서에서 조작이 원자 적이라는 진술을보고 싶을 것입니다. Reflector를 사용하여 .NET 코드를보고 Win32가 호출하는 내용을 확인한 다음 해당 호출이 원자 적인지 여부를 조사해야 할 수도 있습니다. 그렇지 않으면 같은 볼륨에있는 한 디렉토리에서 다른 디렉토리로 이름을 바꾼다는 것이 실제로 새로운 디렉토리 항목을 만들고 이전 디렉토리를 삭제한다는 것을 알기에 충분할 것입니다. 복잡하지 않고 원자도 될 가능성이 있습니다. –

2

파일을 쓰는 것은 일반적으로 원자 적이지 않습니다. OS가 무엇을 드러내는 지 알기 위해서는 Process Monitor을 확인하십시오.

XmlDocument.Save (string)는 FileShare.Read을 사용합니다. ChaosPandion의 솔루션은 FileShare.None을 지정합니다. MSDN의 System.IO.FileShare에서 차이점을 확인하십시오.

0

이 대답 https://stackoverflow.com/a/487198/1429390은 AFAIK에 일종의 원 자성을 사용하기 쉬운 형태로 제공합니다. 원칙은 임시 파일에 작성하고 호출자에게 파일의 이름을 바꿀 수있는 기회를 제공하는 것입니다. 그렇게하면 파일을 작성하고 채우는 동안 일어날 수있는 모든 일이 기존 파일을 파괴 할 수 없습니다.

업데이트 : System.IO.File.Move()가 덮어 쓰기를 거부하기 때문에 업데이트되지 않습니다. 해결 방법은 https://stackoverflow.com/a/10305475/1429390을 참조하십시오.