2010-12-01 5 views
2

테스트 및 시뮬레이션 목적으로 현재 프로세스에서 열려있는 파일을 삭제하고 싶습니다.Windows에서 프로세스에 의해 열린 파일을 삭제할 수 있습니까?

CreateFile docs 열린 핸들이 가리키는 파일을 다른 작업에서 삭제할 수있는 모드 (FILE_SHARE_DELETE)로 파일을 열 수 있다고 나와 있습니다. (그리고 이미 CreateFile (FILE_SHARE_DELETE) + DeleteFile을 통해 이것을 확인하고 확인했다.)

내가 알고 싶은 것은 위에서 언급 한 플래그없이 누구나 열 수있는 파일인지 여부이다. 어떻게 든 지울 수 있습니까?

지금까지 내가 같이 DeleteFile docs가이 기능을 할 수없는 것 이해

응용 프로그램이 정상 I/O에 대한 또는 열려있는 파일을 삭제하려고 시도하는 경우 DeleteFile을 함수를 실패 메모리 맵 파일.

FILE_SHARE_DELETE 플래그가 설정되어 있지 않지만 열려있는 파일을 삭제하는 다른 방법이 있습니까?

+0

경우에 따라 이름을 바꿀 수 있습니다. 이것은 당신이 그것을 바꾸거나 바꾸고 싶을 때 유용합니다 – valdo

답변

4

이렇게 할 방법이 없습니다.

이이 dwFlags 매개 변수에 NULL의 대상 파일 이름 MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT를 사용하여 재부팅 삭제 예약처럼 뭔가를 할 수있는 가장 가까운 방법.

2

그런 파일을 삭제할 합법적 인 방법이 있다고 생각하지 않습니다. 그러나 외부에서 손잡이를 닫을 수있는 도구가 있다는 것을 염두에두면 파일을 쉽게 삭제할 수 있습니다 (Process Explorer은 이러한 도구 중 하나이지만 others이 있음). 누군가 열어 본 파일의 핸들을 닫으면 해당 핸들을 사용하는 동안 오류가 발생합니다.

+2

핸들 값을 재활용 할 수 있으므로, 그렇게하면 매우 이상한 일이 발생할 수 있습니다 (적어도 이론적으로는). 프로덕션 코드의 일부가 아닌 문제를 해결할 때 최후의 수단으로 사용하십시오. –

+0

@Leo Davidson - 예, 알고 있습니다 ... 저는 Raymond Chen의 게시물을 찾으려고했으나 찾을 수 없었기 때문에이 메모를 남겨 두었습니다. 혹시 읽어 보셨습니까? 나중에 참조 할 수 있도록 링크를 추가하는 것이 좋습니다. – eran

+0

나는 같은 기사를 생각하고 있었지만 그것을 찾을 수 없었다. :( –

0

DeleteFileTransacted에서 볼 수 있습니다. 닫을 때 삭제할 파일을 표시 할 수 있습니다. 그러나 파일을 즉시 삭제하려는 경우에는 적합하지 않습니다. 파일에 FILE_SHARE_DELETE 플래그가 없으면 먼저 닫아야합니다. 그러나이 목적을 위해 파일 핸들을 얻은 다음 닫아야합니다. 그러나이 코드는 코드 삽입 기술을 사용합니다. 어떻게 더 쉽게 할 수 있는지 모르겠습니다.

+1

이전과 같은 문제, "응용 프로그램이 일반 I/O 또는 메모리 매핑 파일로 열려있는 파일을 삭제하려고하면 DeleteFileTransacted 함수가 실패합니다." – Roddy

관련 문제