developer tip

Windows에서 원자 적 파일 이름 바꾸기 (덮어 쓰기 포함)가 가능합니까?

optionbox 2020. 11. 25. 07:53
반응형

Windows에서 원자 적 파일 이름 바꾸기 (덮어 쓰기 포함)가 가능합니까?


POSIX 시스템에서 rename (2)는 대상 파일이 존재하고 권한이 허용하는 경우 덮어 쓰기를 포함하여 원자 적 이름 변경 작업을 제공합니다.

Windows에서 동일한 의미를 얻을 수있는 방법이 있습니까? Vista 및 Server 2008의 MoveFileTransacted ()에 대해 알고 있지만 Win2k 이상을 지원하려면 이것이 필요합니다.

여기서 핵심 단어는 원 자성입니다 . 솔루션은 어떤 식 으로든 작업이 일관되지 않은 상태로 유지되는 방식으로 실패 할 수 없어야합니다.

나는 많은 사람들이 win32에서 이것이 불가능하다고 말하는 것을 보았지만 당신에게 묻습니다. 정말입니까?

가능하면 신뢰할 수있는 인용을 제공하십시오.


Win32는 원자 파일 메타 데이터 작업을 보장하지 않습니다. 나는 인용을 제공하고 싶지만 아무것도 없습니다. 서면 또는 문서화 된 보증이 없다는 사실은 그만큼 의미가 있습니다.

이를 지원하려면 자신 만의 루틴을 작성해야합니다. 안타깝지만 win32가 이러한 수준의 서비스를 제공 할 것으로 기대할 수는 없습니다. 단순히이를 위해 설계된 것이 아닙니다.


ReplaceFile()Win32 참조 ( http://research.microsoft.com/pubs/64525/tr-2006-45.pdf )


Windows Vista 및 Windows Server 2008에서 원자 이동 기능이 추가되었습니다-MoveFileTransacted ()

불행히도 이것은 이전 버전의 Windows에서는 도움이되지 않습니다.

MSDN에 대한 흥미로운 기사 .


Windows에서 rename () 호출이 여전히 있지만 사용중인 파일 시스템을 모르면 원하는 보장을 할 수 없다고 생각합니다. 예를 들어 FAT를 사용하는 경우에는 보장 할 수 없습니다.

그러나 MoveFileEx를 사용하고 MOVEFILE_REPLACE_EXISTING 및 MOVEFILE_WRITE_THROUGH 옵션을 사용할 수 있습니다. 후자는 MSDN에 다음과 같은 설명이 있습니다.

이 값을 설정하면 함수가 반환되기 전에 복사 및 삭제 작업으로 수행 된 이동이 디스크로 플러시됩니다. 플러시는 복사 작업이 끝날 때 발생합니다.

이것이 반드시 이름 바꾸기 작업과 같지는 않다는 것을 알고 있지만, 이것이 여러분이 얻을 수있는 최선의 보장이라고 생각합니다. 파일 이동을 위해 그렇게한다면 더 간단한 이름 바꾸기를해야합니다.


Windows 10 1607부터 NTFS는 원자 대체 이름 바꾸기 작업을 지원합니다. 이렇게하려면 NtSetInformationFile (..., FileRenameInformationEx, ...)을 호출하고 FILE_RENAME_POSIX_SEMANTICS 플래그를 지정합니다. 또는 마찬가지로 Win32에서 SetFileInformationByHandle (..., FileRenameInfoEx, ...)를 호출하고 FILE_RENAME_FLAG_POSIX_SEMANTICS 플래그를 지정합니다.


많은 답변이 있지만 예상했던 답변은 아닙니다 ... 적절한 별이 정렬되고 플래그가 사용되었으며 파일 시스템이 소스에서 타겟과 동일하다면 MoveFile 원자 적일 수 있다는 것을 이해했습니다 (아마도 잘못되었습니다). . 그렇지 않으면 작업이 [복사-> 삭제] 파일로 돌아갑니다.

을 고려하면; 또한 MoveFile (원자적일 때)이 여기서도 수행 할 수있는 파일 정보를 설정하는 것임을 이해했습니다 : setfileinfobyhandle .

누군가는 이것에 대해 좀 더 깊이 들어가는 " 파일 시스템 경주 "라는 강연을 했습니다. (약 2/3는 원자 이름 변경에 대해 이야기합니다)


MSDN 문서는 어떤 API가 원 자성인지 아닌지 명확하게 언급하지 않지만 Niall Douglas는 그의 Cppcon 2015 에서 유일한 원자 기능은

SetFileInformationByHandle

FILE_RENAME_INFO.ReplaceIfExiststrue 설정합니다. Windows Vista / 2008 Server부터 사용할 수 있습니다.

니얼은 매우 복잡의 저자이다 LLFIO 라이브러리 하고, 더 나은 죄송 것보다 안전한 심지어 아무것도하지만 제안 된 기능을 사용하여 자성이 중요하다 알고리즘을 작성하는 경우 내가 믿는 있도록 파일 시스템 경쟁 조건의 전문가 ReplaceFile들 ' 설명은 원자 적이 지 않다고 말합니다.

참고 URL : https://stackoverflow.com/questions/167414/is-an-atomic-file-rename-with-overwrite-possible-on-windows

반응형