在文件和目录中搜索的问题.. Windows编程

时间:2010-04-23 17:44:38

标签: c winapi

我正在研究这本书(Addison Wesley Windows系统编程第4版),我认为它无用的我正在研究支持递归的搜索代码,所以它可以深入到代码工作的文件和目录中(我猜)没有语法错误,但输出不是我想要的搜索输出就像:

    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:

首先我注意到我所做的事情不会仅仅在我指定的文件夹内搜索,而是在所有整个驱动器中搜索,第二个烦人的探测器是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;
}

4 个答案:

答案 0 :(得分:5)

您必须过滤掉每个文件夹中找到的...个伪文件夹 粗略地说,在你的递归分支中:

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

答案 1 :(得分:1)

一般来说,你应该跳过“。”和“..”目录,它们是“当前”和“父”目录的同义词。

答案 2 :(得分:0)

几乎无论你如何在Windows上找到目录的内容,第一场比赛都是'。' (当前目录)和'..'(父目录)。你可能想忽略它们。

答案 3 :(得分:0)

通常你明确地测试并跳过“。”和所有目录(但根目录)中存在的“..”子目录。你正在使用的代码递归地搜索子目录,并且由于你没有忽略“..”目录,它将搜索它,最终将导致根目录,并从那里搜索所有子目录 - 这意味着它' ll搜索整个磁盘。