проблемы с поиском в файлах и каталогах .. Windows программирования - PullRequest
3 голосов
/ 23 апреля 2010

Я изучаю эту книгу (Addison Wesley Windows System Programming 4th Edition) и думаю, что это бесполезно. Я работаю над поисковым кодом, поддерживающим рекурсив, чтобы он мог углубиться в файлы и каталоги, в которых работает код (я думаю, ) нет синтаксической ошибки, но вывод не тот, который я хочу, результат поиска выглядит так:

    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 ]

5 голосов
/ 23 апреля 2010

Вы должны отфильтровать псевдопапки . и .., найденные в каждой папке.
Грубо говоря, в вашей рекурсивной ветви:

if((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 
     && data.data.cFileName != "." 
     && data.data.cFileName != "..")
1 голос
/ 23 апреля 2010

В общем, вы должны пропустить "." и ".." каталоги, они являются синонимами для "текущего" и "родительского" каталога.

0 голосов
/ 23 апреля 2010

Обычно вы явно проверяете и пропускаете "." и подкаталоги "..", которые присутствуют во всех каталогах (кроме корневого). Код, который вы используете, рекурсивно ищет в подкаталогах, и, поскольку вы не игнорируете каталог "..", он будет искать его, который в конечном итоге приведет к корневому каталогу, и оттуда искать все подкаталоги - то есть поищу весь диск.

0 голосов
/ 23 апреля 2010

Практически независимо от того, как вы находите содержимое каталога в Windows, первые совпадения будут «.» (текущий каталог) и '..' (родительский каталог). Вы, вероятно, хотите игнорировать их обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...