2010-04-23 3 views
3

이 책 (Addison Wesley Windows System Programming 4th Edition)을 연구 중이며 재귀를 지원하는 검색 코드에서 일하는 쓸모없는 임이 있다고 생각합니다. 파일 및 디렉토리의 코드는 (내 생각)에는 구문 오류가 작동하지 않고 출력은 내가 좋아하는 검색의 넣어 아웃이 원하는되지 않습니다 : 내가 notiiced파일 및 디렉토리에서 검색 문제가 발생했습니다.

not found 
Now, here are the folders: 
not found 
Searching in d:\iust\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. 
\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. 
\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. 
\.\.\.\.\.\..\e-books\.\.\.\.\E-BOOKS 
The file name is: d:\iust\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\ 
.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\ 
.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\ 
.\.\.\.\.\.\.\.\..\e-books\.\.\.\.\E-BOOKS\*Test* 
not found 
Now, here are the folders: 
not found 
Searching in d:\iust\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. 
\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. 
\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. 
\.\.\.\.\.\..\e-books\.\.\.\.. 
The file name is: d:\iust\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\ 
.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\ 
.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\ 
.\.\.\.\.\.\.\.\..\e-books\.\.\.\..\*Test* 
not found 
Now, here are the folders: 

우선 내가 지금 무엇을하지 않을 것이다 지정된 폴더 내에서 검색 만하면되지만 모든 전체 드라이브 및 두 번째 짜증나는 probem은 DOTS입니다. 그리고 .. 각 폴더에 나타나는이 문제를 어떻게 피할 수 있습니까? 지금 내가 전에 언급 한 책을 사용하기 전에 내가 말했듯이, 나는 내가 한 일이 내 코드를 형성하는 더 좋은 방법 인 것처럼 몰랐다.

코드 :

#include "stdafx.h" 
#include <windows.h> 

void SearchForFile(TCHAR *folder, TCHAR *file){ 
    _tprintf(L"Searching in %s\n",folder); //just to show the state 
    TCHAR temp[1000]; 

    _stprintf(temp,L"%s\\%s",folder,file); // here wrote into temp the location as folder/file 
    _tprintf(L"The file name is: %s\n",temp); 
    HANDLE f; 
    WIN32_FIND_DATA data; 
    f=FindFirstFile(temp,&data); 
    if(f==INVALID_HANDLE_VALUE){ 
     _tprintf(L"not found\n"); 

    } 
    else{ 
     _tprintf(L"found this file: %s\n",data.cFileName); 
     while(FindNextFile(f,&data)){ 
      _tprintf(L"found this file: %s\n",data.cFileName); 
     } 
     FindClose(f); 
    } 

    _stprintf(temp,L"%s\\*",folder); // "d:\*" for example 
    _tprintf(L"Now, here are the folders:\n"); 
    f=FindFirstFile(temp,&data); 
    TCHAR temp2[1000]; 
    if(f==INVALID_HANDLE_VALUE){ 
     _tprintf(L"not found\n"); 

    } 
    else{ 
     if((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) 
      { 

      //_tprintf(L"found this directory: %s\n",data.cFileName); 
       _stprintf(temp2,L"%s\\%s",folder,data.cFileName); 
       SearchForFile(temp2,file); 
      } 
     while(FindNextFile(f,&data)){//   _tprintf(L"%d %d\n",data.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY); 
      if((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) 
      // _tprintf(L"found this directory: %s\n",data.cFileName); 
      { 
       _stprintf(temp2,L"%s\\%s",folder,data.cFileName); 
       SearchForFile(temp2,file); 

      } 
     } 
     FindClose(f); 
    } 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    SearchForFile(L"d:\\test", L"*Test*"); 
    return 0; 
} 

답변

5

당신은 모든 폴더에있는 ... 의사 폴더를 필터링 할 수 있습니다.
대략, 재귀 지점에 '.'

if((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 
    && data.data.cFileName != "." 
    && data.data.cFileName != "..") 
+0

오, 고맙습니다.하지만 코드에 대해 어떻게 생각하십니까? 내 자신을 확신하지 못했습니다. 재귀를 더 잘 만들 수있는 방법이 있습니까? –

+0

코드는 대개 OK입니다. 프로덕션 코드의 경우 좀 더 오류 검사를 추가 할 것입니다. 예를 들어 wile-loops 내부에서 (누군가 폴더를 읽는 동안 누군가 USB 스틱을 당긴다면?) –

+0

좋은 소식은 특정 폴더에서 빠져 나올 수는 없지만 여전히 의사 폴더를 보는 것과 초 후에 consoule 유 경우 ((data.dwFileAttributes 및 FILE_ATTRIBUTE_DIRECTORY)를 추가로 I는 다음의 코드를 추가 가까운 에러! = 0 \t \t \t && data.cFileName를 제공! = L에게 "." \t \t \t && data.cFileName를! = L "..") 이게 맞습니까? !! –

0

거의 상관없이 첫 번째 경기가 될 것입니다 Windows에서 디렉토리의 내용을 찾는 방법 (현재 디렉토리) 및 '..'(상위 디렉토리). 둘 다 무시하고 싶을 것입니다.

0

일반적으로 명시 적으로 테스트하고 "." 및 ".."하위 디렉토리는 모든 디렉토리에 있지만 (루트는 제외). 사용중인 코드는 서브 디렉토리를 재귀 적으로 검색합니다. ".."디렉토리를 무시하지 않으므로, 결국 루트 디렉토리로 연결되는 모든 디렉토리를 검색합니다. 즉, 전체 디스크를 검색합니다.

1

일반적으로 "."를 건너 뜁니다. 및 ".."디렉토리는 "현재"및 "상위"디렉토리의 동의어입니다.

관련 문제