2011-09-30 3 views
2

Windows 7에서 네트워크 파일 시스템 용 Windows 탐색기 셸 확장을 구현 중이며 삭제 기능을 구현하는 동안 걸림돌이 발생했습니다.Windows 탐색기 셸 확장 : ITransferSource :: RemoveItem을 통한 재귀 적 삭제?

의 다음과 같이 내 원격 파일 시스템 계층 구조가 있다고 가정 해 봅시다 :

Dir1 
+-Dir2 
| +-A 
| +-B 
+-C 

나의 이해는 당신이 ITransferSource::RemoveItem를 (I 짓을했는지하는) 구현해야한다는 것입니다,하지만 난 먼 아이에서 재귀 적으로 호출 할 것으로 예상 먼저 파일 시스템 트리 (즉, 깊이 우선 재귀 순회) :

(A, B, Dir2, C, Dir1) 

어떤 일이 반복적으로, 나는 각각의 아이들 다음, 먼저 루트를 요구하고있어 것입니다 :

(Dir1, C, Dir2, A, B) 

셸이 이미 작업의 진행률 표시 줄 ("항목 검색 중"대화 상자)을 표시하기 위해 삭제할 모든 항목을 반복적으로 반복하므로 나에게 조금 이상합니다. 원격 파일 시스템은 비어 있지 않은 디렉토리 삭제를 지원하지 않습니다. 내가 아는 한 Windows의 로컬 파일 시스템에도 동일한 제한이 있습니다. 반복 순서 변경에 대한 힌트를 MSDN에서 찾을 수 없습니다.

실제 반복 순서는 파일 시스템의 항목 생성 순서에 따라 달라진다 고 가정합니다.

이 인터페이스 메서드를 구현할 때 전체 나무를 반복적으로 반복 삭제하면 COPYENGINE_S_DONT_PROCESS_CHILDREN을 반환 할 수 있지만이 방법을 사용하면 표준 탐색기 셸처럼 사용자가 삭제 작업을 취소 할 수 없습니다. 나는 이것을 차선책이라고 생각하지만, 더 나은 해결책을 찾지 못하면해야 할 수도 있습니다.

첫 번째 생각은 나중에 비어 있지 않은 디렉토리 삭제 요청을 큐에 넣는 것이었지만 확장 기능은 디렉토리의 모든 하위 항목에 대한 삭제 작업이 완료 될 때이를 알 수 없으므로 작동하지 않을 것이라고 생각합니다. 나는 또한 "나중에"이러한 항목을 삭제 스레드를 생성 할 수 있지만 이상한 설명 할 수없는 동작 및 충돌을 만드는 것이 거의 확실합니다.

내 질문에, Windows 7 셸 확장에서 삭제 작업을 구현하는 적절한 방법은 무엇입니까?

추신 : 말할 수 있듯이 Windows 셸 확장은 완전히 새로운 주제이기 때문에 질문이 불완전한 경우 사전에 사과드립니다. 필요에 따라 질문을 수정합니다.

감사합니다.

+0

나는 이것에 대해 아무것도 몰라,하지만 ITransferSource 정확하게 목적을 위해 설계된 것 같습니다 한 쌍의 : [EnterFolder] (http://msdn.microsoft.com/en-us/library/bb774516) 및 [LeaveFolder] (http://msdn.microsoft.com/en-us/library/bb774523)를 참조하십시오. – Luke

+0

이봐,이 작품! 그것은 반복 순서를 수정하지 않지만'EnterFolder'와'LeaveFolder' 콜백은 내가 기대하는대로 호출됩니다 (Enter Dir1, Enter Dir2, Dir2 나가기, Dir1 남겨주세요). 이 코멘트를 답으로 추가해야합니다. 나는이 질문에 답해주고 질문을 닫을 수 있습니다. –

답변

1

설명서에서 EnterFolderLeaveFolder 방법을 사용하면 도움이 될 것입니다.

+0

다시 한 번 감사의 말씀을 전합니다. 정확히 내가 원하는 것은 아니지만 확실히 그걸로 작업 할 수 있습니다. –

+0

@BenoitMiller : 어떻게 사용 했습니까? 나는 거의 같은 상황에 처해 있으며, EnterFolder와 LeaveFolder는 나를 위해 호출되지 않는다.더욱이 나는 그들이 전화를하는 것이 어떻게 삭제에 도움이 될지 짐작할 수 없다. 좀 확장 해 주시겠습니까? –

+1

RemoveItem에 대한 내 처리기에서, 삭제가 실패하면 폴더의 경로 (PIDL이 아닌 탐색중인 주 객체와 관련된 상태 구조)를 저장합니다. 그런 다음 LeaveFolder가 호출 될 때 경로가 이전에 저장 한 경로와 일치하면 삭제 요청을 다시 시도해야합니다. –