Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ПОИСК ФАЙЛА В ВИНДОУС


Автор: dark_religion 8.10.2006, 13:46
КАК НАЙТИ ФАЙЛ С ОПРЕДЕЛЕННЫМ РАСШИРЕНИЕМ?
НАПИРМЕР! .DOC .TXT .EXE
В CMD есть команда! FIND какой формад для поиска по типу?

Автор: Daevaorn 8.10.2006, 13:59
dark_religion, 
find ищет текст в файлах
Код

dir c:\*.txt /S /B

P.S. ногу с шифта сними

Автор: Earnest 9.10.2006, 10:52
FindFirstFile \ FindNextFile

Автор: fliengster 7.6.2008, 11:38
А как тогда решить задачю если нужно и подкатологи просматривать((((((?

Автор: EnergoHokum 7.6.2008, 12:29
Код

const char fname_mask[]="*.doc";
WIN32_FIND_DATA find_file_data;
//-------------------------------------------------------------------------
#define NEW_SEARCH 0
#define NEXT_SEARCH 1
#define END_SEARCH 2
//-------------------------------------------------------------------------
int find_log_file(char* found_file,WIN32_FIND_DATA* pWFD,unsigned int action)
{ /* Поиск файлов */
    if(action > 2) { return 1; }
    HANDLE hFind=INVALID_HANDLE_VALUE;
    char filename[0xFF];
    char dir_spec[]="./";/* Поиск ведётся в текущей директории */
    /* Создаём маску поиска файлов */
    memcpy(&filename[0],dir_spec,strlen(dir_spec));
    memcpy(&filename[strlen(dir_spec)],fname_mask,strlen(fname_mask)+1);
    switch(action)
    {
    case NEW_SEARCH:
        {
            hFind=FindFirstFile(filename,pWFD);
            if(hFind == INVALID_HANDLE_VALUE)/* Если ничего не найдено */
            { found_file[0]='\0'; return -1; }
            /* Нашли файл, копируем путь к нему в переданный указатель на буфер */
            memcpy(&found_file[0],pWFD->cFileName,    \
                         strlen(pWFD->cFileName)+1                \
                         );
            break;
        }
    case NEXT_SEARCH:
        {
            if(FindNextFile(hFind,&find_file_data) != 0)
            {/* Продолжаем поиск подходящих файлов */
                /* Нашли следующий файл, копируем путь к нему в переданный указатель на буфер */
                memcpy(&found_file[0],pWFD->cFileName,    \
                             strlen(pWFD->cFileName)+1                \
                             );
            }
            else
            {
                return 1;
            }
            break;
        }
    case END_SEARCH:
        {
            FindClose(hFind);
            break;
        }
    return 0;
}


На работоспособность, если что, именно этот код я не проверял.

Автор: Rififi 7.6.2008, 12:46
Цитата(EnergoHokum @  7.6.2008,  12:29 Найти цитируемый пост)
На работоспособность, если что, именно этот код я не проверял.

- несовместима с unicode 
- thread-unsafe
- формирование маски неправильное
- "подкотологи" не просматривает
- утечки ресурсов
- нет фильтрации служебных записей (. и ..)
- поле cFileName имеет размер _MAX_PATH, а не 0xFF
- нет проверок на переполнение буфера

Автор: EnergoHokum 7.6.2008, 12:58
Это-же пример был.

А чому тут thread-unsafe? Вроде, static-переменных нету, параметры по указателям передаются (ну, кроме action, но он, я думаю, не важен).

Насчёт "подкотологов" -- в описании этих функций сказано: "If the string ends with a wildcard, period, or directory name, the user must have access to the root and all subdirectories on the path", из чего я сразу подумал, что в "подкотологи" при поиске они заходят.

Насчёт маски -- тоже не понял: "that can contain wildcard characters (* and ?)".

Утечка ресурсов -- потенциально, если не закрыть поиск, то да. Но всё это безобразие можно оформить в виде класса, и в деструктор затолкать закрытие.

И вообще, повторюсь, это был пример. smile

Автор: Rififi 7.6.2008, 13:14
Цитата(EnergoHokum @  7.6.2008,  12:58 Найти цитируемый пост)
А чому тут thread-unsafe? 

в функции FindNextFile используется глобальная переменная find_file_data

Цитата(EnergoHokum @  7.6.2008,  12:58 Найти цитируемый пост)
Насчёт маски -- тоже не понял: "that can contain wildcard characters (* and ?)".


эти строчки
 memcpy(&filename[0],dir_spec,strlen(dir_spec));
 memcpy(&filename[strlen(dir_spec)],fname_mask,strlen(fname_mask)+1);
на самом деле формируют вот что:

"*.doc"
а надо 
"./*.doc"

Добавлено через 2 минуты и 59 секунд
нет, насчёт маски я таки прогнал, извиняюсь. смутили  strlen'ы

Автор: EnergoHokum 7.6.2008, 13:24
Цитата
используется глобальная переменная find_file_data


Ну, так можно сделать её неглобальной, в функцию-то указатель на неё передаётся...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)