2013-03-21 2 views
1

참고 : 문제가 해결 되었기 때문에 원래 게시물에 댓글을 추가했습니다._findclose를 호출 할시기?

는 "http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx"에 따르면,이 같이 말했다 :

당신이 _findfirst 또는 _findnext 기능 (또는 변형)을 사용하여 완료 후에는 _findclose 호출해야합니다 *. 따라서 응용 프로그램에서 이러한 함수가 사용하는 리소스를 확보 할 수 있습니다. *

- 주석 : 모호하지만 Microsoft에서 말하는 것은 다음과 같습니다. 일부 사용자는 첫 번째 파일을 찾아야합니다. _findnext를 호출해야 함), _findclose를 호출하십시오. 어떤 사용자는 _findnext를 호출했습니다 (그들은 _findfirst를 이미 호출 했어야합니다). 사용을 마친 후 _findclose를 호출하십시오. 사실 _findnext는 여러 번 호출 할 수 있지만 _findclose는 _findfirst가 만든 핸들에만 책임이 있습니다.

다음은 디렉토리의 파일을 나열하는 데 널리 사용되는 코드입니다. - 의견 : 정확합니다. 다음이 개 파일과 디렉토리 1 디렉토리가있는 경우

는 예를 들어, :

. 
.. 
ddd 
file1.txt 
file2.txt 

_findfirst 번이라고합니다. 핸들의 해당 fileinfo는 시스템 디렉토리 "."입니다. (맞습니까?) - 댓글 : no. 핸들은 파일 + 디렉토리 그룹이며, fileinfo는 "커서"역할을합니다. (fileinfo는 항상 "name"필드를 포함하고 있습니다. _findnext의 구현은 "name"을 사용하여 파일 그룹 + 핸들에 지정된 디렉토리 그룹을 찾습니다.)

_findnext는 4 번 호출됩니다. (첫 번째 인수는 항상 "."에 해당하는 핸들입니다.) - comment : yes + no. 첫 번째 인수는 항상 같은 핸들입니다. 핸들은 모든 fileinfo에 해당하는 것이 아니라 그 그룹에 해당합니다.

내 질문은 :

는 "_findclose"않습니다 ONCE 충분하다라고? * - 댓글 : * 예.

_findnext가 핸들 값을 변경하지 않으면 어떻게 다음 파일 (또는 디렉토리)을 찾을 지 "기억"할 수 있습니까? (미안, 어쩌면 내가 "연결리스트"패턴으로 생각하고 있었다.) * - 댓글 : * 나는 fileinfo의 이름 필드를 사용하고있다. Windows 탐색기 에서처럼 폴더의 내용을 정렬합니다. 파일 이름이 주어지면 목록에서 해당 위치를 알 수 있으므로 "다음을 찾을 수 있습니다".

필요 이상으로 _findclose 전화를 걸면 해를 끼칠 수 있습니까? (충돌 등) * - 댓글 : * 어리석은 질문. 죄송합니다!

아니면 다음 코드가 잘못 되었습니까? 그렇다면 구현 방법은 무엇입니까? - 올바른 코드입니다.

// List the files in the directory 
intptr_t file; 
_finddata_t filedata; 
file = _findfirst(desc.c_str(),&filedata); 
if (file != -1) 
{ 
    do 
    { 
    cout << filedata.name << endl; 
    // Or put the file name in a vector here 
    } while (_findnext(file,&filedata) == 0); 
} 
else 
{ 
    cout << "No described files found" << endl; 
} 
_findclose(file); 

프로세스가 작동 중일 때 삭제할 수없는 디렉토리가 응용 프로그램에서 고정되어 있다는 문제가있어서이 질문을 던졌습니다. 그러나 "_findfirst"의 모든 반환 값에 대해 "_findclose"가 호출되도록 보장 할 수 있습니다. "_findnext"를 호출 한 후 "_findclose"를 추가하면 문제가 완벽하게 해결됩니다. 어떻게 설명 할 수 있습니까?

- 댓글 : 사면. 너무 쉽게 "보증"을 사용하지 마십시오. 그것이 바로 버그입니다.

참고 : 파일 열기, 읽기/쓰기/읽기/쓰기 ... 같은 핸들이 무엇인지 이해하는 데 문제가 없습니다. 파일 핸들을 닫으십시오. 이 세 API를 설명하는 문서가 모호하다는 것을 알았습니다.

- 댓글 : 영어 실력 향상을 위해 노력하십시오.

미리 감사드립니다.

답변

4

_findclose에 대한 통화가 _findfirst에 대한 통화와 일치해야합니다. 즉, _findfirst으로 전화 할 때마다 _findclose과 일치하는 전화가 있어야합니다.

위의 코드에서 _findfirst으로 한 번만 전화 했으므로 _findclose으로 한 번만 전화하는 것이 맞습니다.

하위 디렉토리를 재귀 적으로 검색하는 경우 계층 구조를 내림차순으로 _findfirst으로 여러 번 호출하고 끝내면 호출을 _findclose과 일치시켜 계층 구조를 백업합니다.

+0

_findclose가 _findnext를 처리해야합니까? "http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx"의 문구가 나를 혼란스럽게 만들었습니다. – milesma

+0

@milesma : no -'_findfirst'를 한 번 호출 한 다음'_findnext'를 여러 번 (디렉토리의 파일 수에 따라) 호출 한 다음'_findclose'를 한 번 호출하십시오. '_findfirst'를 실제로'_findopen '이라고 생각하면 도움이 될 것입니다.'_findclose'에 대한 호출이 그것과 일치해야한다는 것이 더 분명합니다. –

+0

감사. 나는 또 다른 질문을 던진다. _findfirst (aaa/bbb/*, ...)를 호출 할 때 어떤 폴더가 잠겨 있습니까? 내 디버거는 시스템 디렉토리 "."를 보여줍니다. fileinfo (두 번째 매개 변수)가 반환합니다. – milesma

0

완료되면 _findclose를 한 번만 호출하면됩니다.

Windows에서 프로세스의 현재 디렉토리 인 경우 디렉토리가 잠길 수 있습니다. _chdir으로 전화 해보십시오.

검색되지 않는 경우 ... 검색중인 디렉토리의 파일을여시겠습니까? 열려있는 파일은 디렉토리도 잠글 수 있습니다.

Process Explorer이 내 앱을 보게하는 것이 유용 할 수 있습니다. 그것은 당신이 무엇을 열어 놓았는지 확실히 알려줄 수 있습니다.

+0

감사합니다. 나는 창문에있다. 나는 _chdir에 의해 디렉토리를 바꿨지만, 문제는 여전히 존재한다. – milesma

관련 문제