2010-05-11 13 views
1

분명히 불가능한 작업이기 때문에 이전에 win32 sdk를 사용하여 디렉토리를 삭제하지 않아도되었습니다. 나는 RemoveDirectory, SHFileOperation with FO_DELETE 등디렉토리를 제거 할 수 없음

현재 하나의 스레드에서 CreateDirectory를 호출하고 다른 스레드를 시작하고 새 스레드에서이 디렉토리로 일부 파일을 복사 한 다음에 모든 파일을 삭제합니다. 새 스레드의 디렉터리를 만든 다음 원래의 스레드를 다시 만든 디렉터리에서 빈 디렉터리를 삭제하려고하면 실패합니다. 디렉토리를 삭제하려고하면 디렉토리가 실제로 비어 있지만 아무런 차이가 없습니다. 전체 스레드 측면은 관련성이 없습니다. 왜냐하면 모든 시점에서 모든 것이 하나의 스레드에 있고 작동하지 않았기 때문입니다. 현재 CreateDirectory의 SecurityAttributes 구조를 설정하여 모든 사람에게 액세스 권한을 부여하지만 차이는 없습니다. 과거에 RemoveDirectory가 GetLastError에서 '32'를 반환했습니다. 이는 공유 위반이라고 생각합니다.

하지만 명령 줄에서 빈 디렉터리를 삭제하려고해도 "다른 프로세스에서이 프로세스를 사용하고 있기 때문에 프로세스가 파일에 액세스 할 수 없습니다."라는 메시지는 거부됩니다. 디렉토리를 만든 전체 응용 프로그램을 종료 할 때까지 (참고 : 디렉터리는 GetTempPath에서 생성됩니다.)

+2

어둠 속에서 찌를 수도 있지만 스레드 중 하나에 여전히 디렉토리에 핸들이 열려 있습니까? 핸들을 모두 닫았는지 확인 했습니까? –

+0

내가 아는 한 디렉토리는 CopyFile과 DeleteFile을 통해서만 액세스되지만, 두 번 확인해 보겠습니다. – Mark

+0

사실, 나는 txml (Tiny XML)을 사용하여 디렉토리에서 XML 파일을 엽니 다. 하지만 TixmlDocument는 디렉토리 삭제를 시도 할 때까지 오랫동안 닫혀 있었고 (범위를 벗어나 삭제되었습니다.) 실제로 xml 파일 자체는 오랫동안 삭제되었지만 txml에서는 계속 진행되고 있습니다. – Mark

답변

4

오류 32는 실제로 "다른 프로세스에서 파일을 사용하고 있기 때문에 프로세스가 파일에 액세스 할 수 없습니다."

아마도 복사 목록을 작성하는 데 FindFirstFile()을 사용하고 있습니까? - FindClose()까지 디렉토리를 잠글 것입니다.

+0

"아마도 당신은 FindFirstFile()을 사용하고 있습니까?"예 – Mark

+0

FindClose가 존재하는지조차 몰랐습니다. – Mark

+0

내가 말했듯이 나는 그것을 사용한 적이 없다 - FindClose를 항상 사용하기 위해 전체 앱의 모든 기존 코드를 수정해야 하는가? – Mark

관련 문제