참고 : 문제가 해결 되었기 때문에 원래 게시물에 댓글을 추가했습니다._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를 설명하는 문서가 모호하다는 것을 알았습니다.
- 댓글 : 영어 실력 향상을 위해 노력하십시오.
미리 감사드립니다.
_findclose가 _findnext를 처리해야합니까? "http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx"의 문구가 나를 혼란스럽게 만들었습니다. – milesma
@milesma : no -'_findfirst'를 한 번 호출 한 다음'_findnext'를 여러 번 (디렉토리의 파일 수에 따라) 호출 한 다음'_findclose'를 한 번 호출하십시오. '_findfirst'를 실제로'_findopen '이라고 생각하면 도움이 될 것입니다.'_findclose'에 대한 호출이 그것과 일치해야한다는 것이 더 분명합니다. –
감사. 나는 또 다른 질문을 던진다. _findfirst (aaa/bbb/*, ...)를 호출 할 때 어떤 폴더가 잠겨 있습니까? 내 디버거는 시스템 디렉토리 "."를 보여줍니다. fileinfo (두 번째 매개 변수)가 반환합니다. – milesma