Форум программистов, компьютерный форум CyberForum.ru

нужна функция которая находит файлы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
23.10.2010, 16:53     нужна функция которая находит файлы #1
Добрый день!

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

Нужно чтоб это все работало на Win32 Console Application.

Добпускается использование #include <windows.h>.

Я понимаю, что это сложновато, но может быть кому-то будет интересно заморочиться...

Заранее Вам спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2010, 16:53     нужна функция которая находит файлы
Посмотрите здесь:

C++ функция которая находит среднее арифметическое элементов очереди,если она пуста
C++ Функция, которая находит минимальное значение
C++ Написать программу которая находит файлы, созданные в нерабочее время
C++ Функция, которая для заданного целого числа m находит среди первых m^2-1 чисел Фибоначчи хотя бы одно, делящееся на m (перевести на Си)
Даны два массива. Напишите программу, которая находит такую последовательность элементов максимальной длины, которая содержится и в первом, и во вт C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
23.10.2010, 17:30     нужна функция которая находит файлы #2
Я понимаю, что это сложновато
Это просто
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
23.10.2010, 17:52  [ТС]     нужна функция которая находит файлы #3
Уважаемый Сэр odip,

помойму такая функция есть только в апи...

К сожалению с апи я не знаком.

Если есть возможность, объясни как сделать плз
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
23.10.2010, 18:00     нужна функция которая находит файлы #4
findfirst(), findnext() в Visual Studio 2005
http://msdn.microsoft.com/en-us/libr...=VS.80%29.aspx
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
23.10.2010, 18:18  [ТС]     нужна функция которая находит файлы #5
Папасибо Вам большое...

Т.е. без функций win 32 api можно обойтись... енто радует...

Там <dos.h> нужно включить, мда... круто...

Спасибо Вам, милчеловек!

Добавлено через 2 минуты
Стыдно мне...

Пойду учить матчасть.
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
23.10.2010, 20:32     нужна функция которая находит файлы #6
Т.е. без функций win 32 api можно обойтись... енто радует...
Внутри себя указанные функции наверняка используют функции WinAPI
Так что без WinAPI не обойтись
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
23.10.2010, 20:34     нужна функция которая находит файлы #7
FindFirstFile, FindNextFile
в чем проблема то
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.10.2010, 20:55     нужна функция которая находит файлы #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для тех, кто на виндовс не накопил вывод содержимого директории, из которой запущена программа
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/param.h>
#include <dirent.h>
#include <unistd.h>
 
int main(void){
    char curDir[MAXPATHLEN];
    DIR * d;
    struct dirent * ent;
 
    if ( ! getcwd(curDir, MAXPATHLEN) ){
        perror("getcwd");
        exit(1);
    }
 
    if ( ( d = opendir(curDir) ) == NULL ){
        perror("opendir");
        exit(1);
    }
 
    while ( ent = readdir(d) )
        printf("%s\n", ent->d_name);
 
    closedir(d);
    exit(0);
}
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
23.10.2010, 21:49  [ТС]     нужна функция которая находит файлы #9
Спасибо вам, господа!))

Не сочтите за нахальство, а если использовать _findfirst(), _findnext() из <io.h>

Там несколько структур -

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct _finddata32_t {
        unsigned    attrib;
        __time32_t  time_create;    /* -1 for FAT file systems */
        __time32_t  time_access;    /* -1 for FAT file systems */
        __time32_t  time_write;
        _fsize_t    size;
        char        name[260];
};
 
struct _finddata32i64_t {
        unsigned    attrib;
        __time32_t  time_create;    /* -1 for FAT file systems */
        __time32_t  time_access;    /* -1 for FAT file systems */
        __time32_t  time_write;
        __int64     size;
        char        name[260];
};
 
struct _finddata64i32_t {
        unsigned    attrib;
        __time64_t  time_create;    /* -1 for FAT file systems */
        __time64_t  time_access;    /* -1 for FAT file systems */
        __time64_t  time_write;
        _fsize_t    size;
        char        name[260];
};
 
struct __finddata64_t {
        unsigned    attrib;
        __time64_t  time_create;    /* -1 for FAT file systems */
        __time64_t  time_access;    /* -1 for FAT file systems */
        __time64_t  time_write;
        __int64     size;
        char        name[260];
};
если есть потребность записать названия всех имеющихся файлов в char * X [nFind]; (задать динамически), то какой элемент структуры присваивать указателю на Х? (a.name; ?) Получается, нужно создать объект из одной из этих структур, какую выбирать то?

Я еще раз извиняюсь, просто хочу понять все до конца по этой теме...

Заранее спасибо!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.10.2010, 21:57     нужна функция которая находит файлы #10
Don Vito, этим лучше не заморачиваться. Вот пример в MSDN, как содержимое директории получить: http://msdn.microsoft.com/ru-ru/library/aa365200
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
23.10.2010, 22:09  [ТС]     нужна функция которая находит файлы #11
Бинго!!!

Нашел один файл в зданной дир...

Мне приятный

Добавлено через 4 минуты
easybudda, спасибо тебе!

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

Я пока в <io.h> не залез, вообще плохо понимал, что происходит...О_о

Причем, нефига я название файла не получил cout << data.name << endl; -выдало название папки
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.10.2010, 22:39     нужна функция которая находит файлы #12
Цитата Сообщение от Don Vito Посмотреть сообщение
Я пока в <io.h> не залез, вообще плохо понимал, что происходит...
ну это примерно, как начинать учиться водить автомобиль с досконального изучения работы двигателя...
Вот так выдаёт список текстовых файлов в директории, откуда запускается
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
 
#ifndef MAX_PATH
#define MAX_PATH 1024
#endif
 
#define NAME_MASK "*.txt"
 
int main(void){
    char curDir[MAX_PATH];
    char ** list;
    size_t cnt, i;
    WIN32_FIND_DATAA findData;
    HANDLE hFind;
 
    GetCurrentDirectoryA(MAX_PATH, curDir);
    
    cnt = 0;
    list = NULL;
    hFind = FindFirstFileA(NAME_MASK, &findData);
    if ( hFind == INVALID_HANDLE_VALUE ){
        fprintf(stderr, "Can't find any text file!\n");
        exit(1);
    }
    do {
        if ( ( list = (char**)realloc(list, sizeof(char*) * (cnt + 1)) ) == NULL ){
            perror("realloc");
            exit(1);
        }
        if ( ( list[cnt++] = strdup(findData.cFileName) ) == NULL ){
            perror("strdup");
            exit(1);
        }
    } while ( FindNextFileA(hFind, &findData) );
 
    FindClose(hFind);
 
    if ( ! list ){
        fprintf(stderr, "No files in list!\n");
        exit(1);
    }
 
    printf("Text files in %s:\n", curDir);
    for ( i = 0; i < cnt; ++i )
        printf("%s\n", list[i]);
 
    for ( i = 0; i < cnt; ++i )
        free(list[i]);
    free(list);
 
    exit(0);
}
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
23.10.2010, 22:46  [ТС]     нужна функция которая находит файлы #13
ПриУэт, еще раз!

У тебя программа ищет все файлы в текущей дир..., так?

А нужно в заданой, или я конкретно туплю...О_о

В любом случае спасибо, что помогаешь!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.10.2010, 23:11     нужна функция которая находит файлы #14
Цитата Сообщение от Don Vito Посмотреть сообщение
У тебя программа ищет все файлы в текущей дир..., так?
угу

Цитата Сообщение от Don Vito Посмотреть сообщение
А нужно в заданой
либо SetCurrentDirectory(), либо в FindFirstFile() передавать путь к папке + шаблон для поиска...
Только не забывайте, что если нужно просматривать вложенные папки, прийдётся это самому делать. То есть либо в одном цикле рекурсивно просматривать всё содержимое, проверять найденное, если оно каталог - просматривать его, если файл - проверять, оканчивается ли на .txt Короче не так всё просто...
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
23.10.2010, 23:27  [ТС]     нужна функция которая находит файлы #15
Еще раз спсаибо Вам!

Понятно...

Тут вложеных папок нет...

Есть вот такой путь:" D:\\архив котировок ФИнам\\EURUSD" .

В папке EURUSD есть n .txt файлов. Хотелось бы иметь програмно их точные названия.

Попробовал указать полный путь (см. ниже)

На экране появляется "муссор", в смысле ничего хорошего

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void Stock_Data::Files_names(){
 
   _finddata_t data;
   
   long nFind = _findfirst("D:\\архив котировок ФИнам\\EURUSD.txt",&data);
    if (nFind != -1) {
        cout << "Если этого не сделать то произойдет утечка ресурсов" << endl;
        _findclose(nFind);}
 
    /*  char **q;
        q = new char *[nFind];
 
        if (!q){
        
            cout << "It's not possible to get memory!" << endl;
 
            //delete q;
        }else {*/
        
            
            cout << data.name << endl;
            cout << nFind << endl;
 
        //}
 
    
   
}
Спасибо!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.10.2010, 23:42     нужна функция которая находит файлы #16
Цитата Сообщение от Don Vito Посмотреть сообщение
Попробовал указать полный путь (см. ниже)
На экране появляется "муссор"
либо переименовывайте папку, чтобы в ней русских символов небыло, либо заморочки с UNICODE...
нужна функция которая находит файлы
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
24.10.2010, 01:52  [ТС]     нужна функция которая находит файлы #17
Перименовал - не работает...муссор!

Может тут нужно что нибудь изменить?

long nFind = _findfirst("D:\finam\EURUSD.txt",&data);

Добавлено через 2 часа 6 минут
easybudda, привет!

Вообщем

нужно вот так

C++
1
2
3
_finddata_t data;
   
   long nFind = _findfirst("D:\\finam\\EURUSD\\*.*txt",&data);
Evg подсказал!

easybudda, спасибо тебе!

И всем остальным тоже спасибо!))
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.10.2010, 01:56     нужна функция которая находит файлы #18
Цитата Сообщение от Don Vito Посмотреть сообщение
long nFind = _findfirst("D:\\finam\\EURUSD\\*.*txt",&data);
ну почти...
C++
1
long nFind = _findfirst("D:\\finam\\EURUSD\\*.txt",&data);
а то на file.netxt тоже сработает
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
24.10.2010, 02:02  [ТС]     нужна функция которая находит файлы #19
сто пудово))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2011, 00:24     нужна функция которая находит файлы
Еще ссылки по теме:

составить программу, которая находит максимальное и минимальное значение среди элементов одномерного массива Y, которая состоит из N целых чисел C++
C++ Нужна программа, которая по регулярному выражению находит все совпадения в строке
Функция, которая находит элемент массива C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Sonador
 Аватар для Sonador
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 14
27.07.2011, 00:24     нужна функция которая находит файлы #20
Здравствуйте! Пытаюсь написать программу по просьбе друга. Часть её удалось сделать благодаря коду написанному easybudda в сообщении #12. Вот код, который у меня получился.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <windows.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
 
#ifndef MAX_PATH
#define MAX_PATH 1024 // Замена константы максимального полного имени файла с 260 на 1024
#endif
 
#define NAME_MASK "*.*"  // Определение маски для поиска файлов (любое имя, любое расширение)
 
char **FindFileInDirectory(FILETIME **data, size_t *cnt);       // поиск всех файлов в папке
 
int main()
{
    size_t *cnt = new size_t;
    FILETIME **data = NULL;
    char **list = FindFileInDirectory(data, cnt);
/*  if ( ! list )   // Проверка есть ли в списке list файлы
        printf("There aren't files containing \"432\"\n");
    else
    {
        printf("Files contain \"432\":\n");
        for ( size_t i = 0; i < *cnt; ++i )
        {
            printf("%i. %s \n",i+1, list[i]);
        }
    }
*/
    if ( ! data )   // Проверка есть ли в списке data файлы
        printf("There aren't any info\n");
    else
    {
        printf("Data:\n");
        for ( size_t i = 0; i < *cnt; ++i )
        {
            SYSTEMTIME stUTC, stLocal;
            FileTimeToSystemTime(data[i], &stUTC);
            SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
            printf("\tcreate in: %02d/%02d/%d  %02d:%02d\n",
            stLocal.wDay, stLocal.wMonth, stLocal.wYear,
            stLocal.wHour, stLocal.wMinute);
        }
    }
    return 0;
}
 
char **FindFileInDirectory(FILETIME **data, size_t *cnt)
{
    char curDir[MAX_PATH];      // переменная для хранения текущего файловый путь
    char **list = NULL;         // указатель на переменную, хранящую список имен файлов
    size_t cnt_list = 0, cnt_data = 0;  // счетчик количества файлов в папке
    WIN32_FIND_DATAA find;             // структура, описывающая файл, найденный функцией  FindFirstFile и FindNextFile
    HANDLE hFind;               // указатель на открытый файл
 
    SetCurrentDirectoryA("Proba");      // изменение текущей дирректории на вложенную папку 
    GetCurrentDirectoryA(MAX_PATH, curDir); // функция возвращает текущий каталог. Имя каталога нормализовано и содержит '\' на конце.
 
    hFind = FindFirstFileA(NAME_MASK, &find);
 
    if ( hFind == INVALID_HANDLE_VALUE )    // В случае неудачи буфер не заполняется и возвращается недействительный описатель (INVALID_HANDLE_VALUE = -1).
    {
        fprintf(stderr, "Can't find any file!\n");
        exit(1);
    }
 
    do      
    {
        // определение имен файлов
        if ( ( list = (char**)realloc(list, sizeof(char*) * (cnt_list + 1)) ) == NULL ) // Динамический массив
        {
            perror("realloc");  // Сообщение об ошибке отсутствия свободной памяти
            exit(1);
        }
        if ( ( list[cnt_list++] = _strdup(find.cFileName) ) == NULL )   // Присоединяет память при помощи вызова malloc, копирует  в  нее строку  string  и возвращает указатель на присоединенную память
        {
            perror("strdup");   // Сообщение об ошибке отсутствия свободной памяти
            exit(1);
        }
        // определение даты создания
        if ( ( data = (FILETIME**)realloc(data, sizeof(FILETIME*) * (cnt_data + 1)) ) == NULL ) // Динамический массив
        {
            perror("realloc");  // Сообщение об ошибке отсутствия свободной памяти
            exit(1);
        }
        data[cnt_data++] = &find.ftCreationTime;
 
    } while ( FindNextFileA(hFind, &find) );
 
    FindClose(hFind);
 
    *cnt = cnt_list;
    printf("Files in %s:\n", curDir);
    return list;
}
Проблема в том, что при попытке вывода информации в main программа говорит, что data пустая. Видимо я запуталсь в указателях. Возврат list тоже наверное извращенный, но по другому не получилось. Помогите плиз отредактировать, так что б и list, и data были доступны в main... (вывод на экран на данном этапе всего лишь проверка, дальше над ними ещё будет много издевательств)...
Yandex
Объявления
27.07.2011, 00:24     нужна функция которая находит файлы
Ответ Создать тему
Опции темы

Текущее время: 17:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru