2017-04-23 1 views
0

Windows API를 사용하면 FILE_SHARE_DELETE 권한없이 다른 프로세스에서 열려있는 파일의 이름을 바꿀 수 있습니까?FILE_SHARE_DELETE없이 다른 프로세스에서 열려있는 파일의 이름 바꾸기

을 : 모두 삭제하고 이름 바꾸기 작업 액세스를 허용 삭제

는 내가 말할이가 CreateFile docs에 따라 불가능하다 생각했다. 최종 사용자의 명령 프롬프트에서 일반 rename을 통해 이름 변경과 일관성

은, 나는 종종 The process cannot access the file because it is being used by another process.가 발생했습니다; 최종 사용자 GUI 및 파이썬의 os.rename을 통해 이름을 바꾸면 비슷한 오류가 발생합니다. 이름을 변경하는 것은 문제가 결코 다른 프로세스가없는 공유를 삭제 열린 파일이있는 경우

삭제가 실패합니다

그러나, this 높은 upvoted 대답은 반대 상태로 보인다.

그리고 그것은 단순한 사안이 아닙니다. 전체 답변은 해당 성명에 따라 달라집니다. 삭제시 이름 변경이 실패하지 않으면 OP 문제 만 해결합니다.

무엇이 누락 되었습니까?

참고 : 중요한 점은 C# API (C# API보다 강력하다고 가정)를 사용하는 Windows 10을 말합니다.

편집 : 코드 스 니펫을 new question으로 옮겼습니다.

답변

1

MOVEFILE_DELAY_UNTIL_REBOOT 플래그를 사용하여 지연된 조작으로 만 가능합니다. 관리자 토큰 (UAC)을 사용하려면 사용자 컨텍스트가 필요합니다. 이것은 설치자가 사용 중에 파일을 대체하는 방법이며 운영자가 시스템을 재부팅 할 것을 요구합니다.

알다시피, 사소한 것이 아니므로이를 피하려고 노력해야합니다.

+0

하지만 왜 3 파일 인수가있는'File.Replace'가 대상 파일이 사용 중이더라도 성공합니까? 재부팅 될 때까지 백업 이름의 대상 이름 변경이 지연되는 경우 대상의 이름을 대상으로 변경하는 작업이 실패합니다. – max

+0

'File.Replace'는 다른 작업입니다. 이 파일은 ['ReplaceFile'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365512(v=vs.85)asp)에 매핑됩니다. 'lpReplacedFileName'이 다른 앱에 의해 열릴 때 이것이 성공할 수있는 이유는 http://stackoverflow.com/questions/32860388/replacefile-alternative-when-application-keeps-file-locked를보십시오. –

+0

와우 내 질문에 대한 전체 답변은 매우 다른 질문에 [삭제 된 대답] (http://stackoverflow.com/a/32862684/336527)에 포함되어 있습니다 ... 그래서 IIUC'ReplaceFile'은 파일 메타 데이터를 변경합니다 (= 디렉토리 항목). 매우 깔끔하고, Windows에서 원자 적 파일 쓰기를 구현하는 유일한 방법이기 때문에 잘 알려지지 않았습니다. 어쩌면 당신은 당신의 대답에이 정보를 추가 할 수 있습니다. – max

관련 문제