Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация поиска по маске 
:(
    Опции темы
wally1
Дата 2.6.2014, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.5.2014

Репутация: нет
Всего: нет



Доброго времени суток. Помогите найти решение хочу написать программу для поиска файлов по маске на всех дисках которые есть в компьютере и во всех каталогах и подкаталогах. А пока могу произвести поиск в одной указанной  папке. Подскажите как решить мою задачу. 
PM MAIL   Вверх
feodorv
Дата 2.6.2014, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Рекурсивный обход всех папок?
Доступные устройства можно получить от GetLogicalDrives.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GremlinProg
Дата 3.6.2014, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(wally1 @  2.6.2014,  23:11 Найти цитируемый пост)
А пока могу произвести поиск в одной указанной  папке. Подскажите как решить мою задачу. 

Придется рекурсивно обойти все логические диски, как уже отметил feodorv, причем, насколько я знаю, на каждый FindFirst можно указать только одну маску поиска, либо фильтровать файлы вручную, по маске *.*

Добавлено через 1 минуту и 31 секунду
рекурсию, конечно же можно преобразовать в "цикл с динамическим стеком"


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
wally1
Дата 3.6.2014, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.5.2014

Репутация: нет
Всего: нет



Доступные устройства вытаскиваю так 
Код

#include<iostream>
#include<windows.h>
#include <conio.h>
using namespace std;
int main()
{
    char buf[26];
    GetLogicalDriveStringsA(sizeof(buf),buf);
    char *DRF [] = {"Unknown" , "Invalid path",
        "Removable", "Fixed" , "Network drive","CD-ROM", "RAM disk"};
    for(char *s=buf; *s; s+=strlen(s)+1)
         cout<<s<<"  "<<DRF[GetDriveTypeA(s)]<<endl;
 
    getch();
    return 0;
}

и код поиска только он не ищет в подпапках
Код

#include <windows.h>
#include <iostream.h>
#include <stdio.h>
int main()
{

    //program deletes all files with mask 'filemask' from 'dirname' directory
    char* dirname = "C:\\";
    char* filemask = "*.*";
    char* dir_plus_mask = new char[strlen(dirname) + strlen(filemask)+1];

    strcpy(dir_plus_mask, dirname);
    strcat(dir_plus_mask, filemask);

    WIN32_FIND_DATA FindFileData;
    HANDLE hf;

    char curFile[MAX_PATH];
    hf = FindFirstFile(dir_plus_mask, &FindFileData);
    if (hf != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                continue;

            curFile[0] = 0;
            strcpy(curFile, dirname);
            strcat(curFile, FindFileData.cFileName);
            cout <<" file \"" << curFile << "\"..." << endl;            
        
            
            
        }
        while (FindNextFile(hf,&FindFileData)!=0);
        FindClose(hf);
    }
    cout <<"Not file \"" << endl;
getchar ();
    return 0;
}


Как заставить второй код брать по очереди диски с первого кода и искать файлы по маске (несколько расширений) во всех папках за исключением может каталогов WINDOWS и Program Files. Читал будто рекурсивный метод будет много ресурсов жрать ведь файлов много. Возможно ли параллельно несколько дисков обрабатывать?
PM MAIL   Вверх
wally1
Дата 4.6.2014, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.5.2014

Репутация: нет
Всего: нет



Добрый вечер. Нашел код который хорошо ищет файлы.
Код

#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;

//функция поиска
bool seek(LPCTSTR lpszFileName, BOOL bInnerFolders)
{                     
    LPTSTR part;
    char tmp[MAX_PATH];                // temporary array
    char name[MAX_PATH];

    HANDLE hSearch = NULL;
    WIN32_FIND_DATA wfd;
    memset(&wfd, 0, sizeof(WIN32_FIND_DATA));
    
    //search in embeded folders for first
    if(bInnerFolders)
    {
        if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) 
            return FALSE;
        lstrcpy(name, part);
        lstrcpy(part, "*.*");

        //if folder exists, down to it
        wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
        if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
            do
            {
                //if current folder is a service folders? which no need to check
                if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))            
                    continue;
                if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //if it's a folder
                {
                    // making a new path
                    char next[MAX_PATH];
                    if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
                    lstrcpy(part, wfd.cFileName);
                    lstrcat(next, "\\");
                    cout << next << endl;
                    lstrcat(next, name);
                    //recourse down
                    seek(next, TRUE);
                }
            }
            while (FindNextFile(hSearch, &wfd)); //finding next file in folder
            FindClose (hSearch); // closing a search descriptor
    }
    if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) 
        return TRUE; 
    do
    if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // is it's a file
    {
        char file[MAX_PATH];
        if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
        lstrcpy(part, wfd.cFileName);
        
        //adding its to a result list
        cout << file << endl;
    }
    while (FindNextFile(hSearch, &wfd));    // next file in folder
    FindClose (hSearch);                    // close search descriptor

    return TRUE;
}
//главная функция   
int main()
{
/*
Вызываем функцию seek, указав ей искать все *.txt файлы на диске
C:\, так же второй параметр, false, говорит функции не заглядывать
во вложенные каталоги, а искать только в корневом). Если задать этот
параметр как true - программа начнет перебирать все каталоги.
Так же мы проверяем значение, которое возвращает функция, если это false - выводим сообщение об ошибке.
*/
    if(!seek("c:\\*.txt", true ))
        cout << "Searching failed" << endl;
    return 0;
}

Но как видно из кода он ищет на одном диске один вид файлов, но по всему дереву каталогов. Он нехорошо выводит найденные файлы  вперемешку с пустыми папками подскажите как это исправить? И главное как устроить прохождение поиска по всем дискам и увеличить количество расширений в маске поиска?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.