어쨌든 XMLDocument.Save()를 사용하여 만든 파일을 모니터링하는 다른 프로세스가 부분 파일을 발견 할 수 있습니까? Save()가 기존 파일을 덮어 쓰는 경우 어떤 차이가 있습니까?XMLDocument.Save는 원자 연산입니까?
답변
이와 같이 저장하면 아무런 문제가 없어야합니다.
using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
{
xmlDoc.Save(file);
}
나는 원 자성을 보장하지 않는다고 생각합니다. 당신은 그것에 의존해서는 안됩니다.
임시 파일을 저장하고 이름을 바꾸는 것은 어떨까요? 이름 바꾸기가 원자 적으로 수행 될 수 있습니까, 아니면 파일 시스템이 이런 방식으로 작동하지 않습니까? –
나는 이름 바꾸기가 그 일을 할 것이라고 생각할 것이다. 그것은 당신이 원하는 "보증"의 정도에 달려 있습니다. "진짜"보장을 원한다면, 문서에서 조작이 원자 적이라는 진술을보고 싶을 것입니다. Reflector를 사용하여 .NET 코드를보고 Win32가 호출하는 내용을 확인한 다음 해당 호출이 원자 적인지 여부를 조사해야 할 수도 있습니다. 그렇지 않으면 같은 볼륨에있는 한 디렉토리에서 다른 디렉토리로 이름을 바꾼다는 것이 실제로 새로운 디렉토리 항목을 만들고 이전 디렉토리를 삭제한다는 것을 알기에 충분할 것입니다. 복잡하지 않고 원자도 될 가능성이 있습니다. –
파일을 쓰는 것은 일반적으로 원자 적이지 않습니다. OS가 무엇을 드러내는 지 알기 위해서는 Process Monitor을 확인하십시오.
XmlDocument.Save (string)는 FileShare.Read을 사용합니다. ChaosPandion의 솔루션은 FileShare.None을 지정합니다. MSDN의 System.IO.FileShare에서 차이점을 확인하십시오.
이 대답 https://stackoverflow.com/a/487198/1429390은 AFAIK에 일종의 원 자성을 사용하기 쉬운 형태로 제공합니다. 원칙은 임시 파일에 작성하고 호출자에게 파일의 이름을 바꿀 수있는 기회를 제공하는 것입니다. 그렇게하면 파일을 작성하고 채우는 동안 일어날 수있는 모든 일이 기존 파일을 파괴 할 수 없습니다.
업데이트 : System.IO.File.Move()가 덮어 쓰기를 거부하기 때문에 업데이트되지 않습니다. 해결 방법은 https://stackoverflow.com/a/10305475/1429390을 참조하십시오.
- 1. 할당 = 및 빼기 할당 - = C의 원자 연산입니까?
- 2. iPhone에서 단일 플로트 할당이 원자 적 연산입니까?
- 3. C에서 64 비트 쓰기 연산입니까
- 4. 원자 변수 Vs. 원자 조작
- 5. 원자 스왑을 사용하여 원자 증분을 구현 하시겠습니까?
- 6. pthread_mutex_unlock을하지 원자
- 7. 원자 쓰기는
- 8. (유지, 비 원자) 및 (비 원자, 유지) 차이가 있습니까?
- 9. Mac OS 프로그래밍에서 기본값은 무엇입니까? 비 원자 또는 원자?
- 10. 디렉토리를 원자 적으로 이동
- 11. 원자 피드에 데이터 노출
- 12. MS 속도의 원자 업데이트
- 13. 원자 업그레이드 스크립트
- 14. MS 액세스 원자 트랜잭션
- 15. MySQL 트랜잭션은 원자 적입니까?
- 16. "원자"는 여기에 필요합니까?
- 17. 원자 기록을 확인하는 방법?
- 18. 원자 피드 기본 정보
- 19. UNIX 휴대용 원자 연산
- 20. 원자 방법의 용도는 무엇입니까?
- 21. printk 원자 안전입니까?
- 22. Java에서의 원자 대기 구현
- 23. 레일에 mongoid 원자 업데이트
- 24. PHP 원자 피드 만들기
- 25. 코코아 비 원자 속성
- 26. 원자 저장소 유형이란 무엇입니까?
- 27. .NET에서의 원자 파일 복사
- 28. 원자 애니메이션 - 어떤 기술
- 29. 원자 및 참조
- 30. Python에서 원자 파일 바꾸기
약 3 초 동안 펀치에 맞 춥니 다. upvote가 :) –