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

Поиск всех файлов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
ganjawar
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 40
09.09.2011, 22:45     Поиск всех файлов #1
Здравствуйте
Задача кода найти все файлы в папке,для их дальнейшего использования
Код такой:
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
#define _WIN32_WINNT 0x0400
 
#include <windows.h>
#include <string.h>
#include <stdio.h>
using namespace std;
 
 
 
int main(int argc, char *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;
   char DirSpec[MAX_PATH];  // directory specification
   DWORD dwError;
   
   printf("input dir");
   scanf(DirSpec);
   printf ("Target directory is %s.\n", DirSpec);
 
   hFind = FindFirstFile((LPCWSTR)DirSpec, &FindFileData);
 
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("Invalid file handle. Error is %u\n", GetLastError());
      return (-1);
   } 
   else 
   {
      printf ("First file name is %s\n", FindFileData.cFileName);
      while (FindNextFile(hFind, &FindFileData) != 0) 
      {
         printf ("Next file name is %s\n", FindFileData.cFileName);
      }
    
      dwError = GetLastError();
      FindClose(hFind);
      if (dwError != ERROR_NO_MORE_FILES) 
      {
         printf ("FindNextFile error. Error is %u\n", dwError);
         return (-1);
      }
   }
   return (0);
}
Проблема в том,что hFind всегда равен INVALID_HANDLE_VALUE
И когда делается printf(dirspec) внутри оказываются иероглифы, и как Я понял не распознается путь,в чем проблема?или может помимо этого есть еще ошибки?
Спасибо за внимание
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2011, 22:45     Поиск всех файлов
Посмотрите здесь:

поиск файлов C++
Поиск файлов C++
C++ Поиск файлов С++
C++ Обход всех файлов в каталоге
C++ Поиск файлов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
09.09.2011, 23:11     Поиск всех файлов #2
C++
1
2
3
4
5
   printf("input dir");
   scanf(DirSpec);
   printf ("Target directory is %s.\n", DirSpec);
 
   hFind = FindFirstFile((LPCWSTR)DirSpec, &FindFileData);
FindFirstFileA((LPCSTR)DirSpec, &FindFileData);
либо юзай wchar ввод (wscanf)
C++
1
char DirSpec[MAX_PATH];
C++
1
(LPCWSTR)DirSpec
если короче, то ты пытаешься сказать функции использовать обычную char строку как wchar.
ganjawar
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 40
10.09.2011, 00:15  [ТС]     Поиск всех файлов #3
Какой способ лучше выбрать?
использовать функцию FindFirstA?
или wchar?
если есть возможность,то исправьте нужные строки кода,иначе будет много нубовских вопросов)
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
10.09.2011, 00:16     Поиск всех файлов #4
Цитата Сообщение от ganjawar Посмотреть сообщение
или wchar?

C
1
wchar_t DirSpec[MAX_PATH];
C
1
wscanf(DirSpec)
C
1
hFind = FindFirstFile(DirSpec, &FindFileData);
ganjawar
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 40
10.09.2011, 00:29  [ТС]     Поиск всех файлов #5
Спасибо за помощь,но при отладке в переменной DirSpec непонятные символы [] и при wprintf(DirSpec) они и выводятся и получается что путь ен правильный..Но ошибок компилятор не выдает,уже хорошо
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.09.2011, 01:01     Поиск всех файлов #6
нерекурсивно выводятся имена файлов и папок в указанной директории
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
#include<windows.h>
#include<iostream>
#include<vector>
#include<string>
#include<iterator>
using namespace std;
 
 
//Тут вот вариант без использования функций. 
 
 
//int main(){
//SetConsoleCP(1251);
//SetConsoleOutputCP(1251);
//
//        WIN32_FIND_DATA FindFileData;
//        HANDLE hf;
//        hf=FindFirstFile(".\\*", &FindFileData);
//        //hf=FindFirstFile("c:\\*", &FindFileData);
//        if (hf!=INVALID_HANDLE_VALUE){
//                do{
//                        std::cout << FindFileData.cFileName << "\n";
//                }
//                while (FindNextFile(hf,&FindFileData)!=0);
//                FindClose(hf);
//        }
//        getchar ();
//}
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
//Кому надо- вот здесь разработана функция, возвращающая векор строк, каждая из которых- имя файла или папки 
//в указанной директории
vector<string> search_name_file_and_papok () {
        WIN32_FIND_DATA FindFileData;
        HANDLE hf;
        vector <string> imena_papok_i_failov;
        hf=FindFirstFile(".\\*", &FindFileData);
        if (hf!=INVALID_HANDLE_VALUE){
                do{
                 imena_papok_i_failov.push_back (string (FindFileData.cFileName));  
                }
                while (FindNextFile(hf,&FindFileData)!=0);
                FindClose(hf);
        }
 
        return imena_papok_i_failov;
}
 
int main(){
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 vector <string>  faili= search_name_file_and_papok ();
 
 copy (faili.begin (), faili.end(), ostream_iterator <string> (cout, "\n"));
 
 getchar ();
}
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
10.09.2011, 01:12     Поиск всех файлов #7
А как подобное можно сделать в *NIX? Я уже давно хочу себе такую утилитку, но не знаю как сделать вот что:
1. организовать обход дерева директорий(и поддиректорий)
2. идентифицировать заранее неизвестный файл (т.е. не могу же я указать в коде 2000 имен файлов, а перебрать надо все)
алгоритмически тут конечно не сложно, может кто вспомнит для меня какие API - шные функции?
Да и времени совсем нету.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.09.2011, 01:14     Поиск всех файлов #8
Цитата Сообщение от alkagolik Посмотреть сообщение
1. организовать обход дерева директорий(и поддиректорий)
http://www.cyberforum.ru/cpp-cross-p...ead345596.html
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.09.2011, 01:15     Поиск всех файлов #9
Так тебе по юникс или под винду?
ganjawar
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 40
10.09.2011, 01:27  [ТС]     Поиск всех файлов #10
kravam Спасибо!Мне надо было под винду,но и под юникс тоже надо будет потом,если есть что посоветовать то буду благодарен

Добавлено через 4 минуты
и еще одни вопрос.Как Мне сделать ввод своего пути в переменную и отправить вместо пути "c:\\*"
ошибка с преобразованием типов((
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.09.2011, 01:34     Поиск всех файлов #11
я вообще-то alkagolik, спрашивал.
...это что ли надо?
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
vector<string> search_name_file_and_papok () {
        WIN32_FIND_DATA FindFileData;
        HANDLE hf;
        vector <string> imena_papok_i_failov;
 
        char ima_papki [MAX_PATH]; 
        printf ("ВВоди имя папки\n");
        gets (ima_papki);  
        hf=FindFirstFile(ima_papki, &FindFileData);
 
 
//        hf=FindFirstFile(".\\*", &FindFileData);
        if (hf!=INVALID_HANDLE_VALUE){
                do{
                 imena_papok_i_failov.push_back (string (FindFileData.cFileName));  
                }
                while (FindNextFile(hf,&FindFileData)!=0);
                FindClose(hf);
        }
 
        return imena_papok_i_failov;
}
 
int main(){
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 vector <string>  faili= search_name_file_and_papok ();
 
 copy (faili.begin (), faili.end(), ostream_iterator <string> (cout, "\n"));
 
 getchar ();
}
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
10.09.2011, 01:55     Поиск всех файлов #12
Цитата Сообщение от kravam Посмотреть сообщение
Так тебе по юникс или под винду?
linux
Я очень часто подолгу заморачиваюсь в поисках той или иной функции\константы при написании\изучении программ и пришел к выводу что было бы неплохо иметь утилитку с ключом - искомой строковой\символьной фразой и корнем директорий /usr/include ну товарищ выше ссылку кинул, мысль понятна: создать вектор файлов. а как эти файлы поместить в вектор без прямого указания filename это пока загадка.

Добавлено через 10 минут
Ага, вижу там по ссылке есть такое, но не то, копируются все файлы в вектор. Это лишнее у меня задача открыть прочитать и закрыть все файлы в директории и поддиректориях
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.09.2011, 01:57     Поиск всех файлов #13
Ага, то есть тебе надо несколько иное? Я так понял, ты ищешь функцию.константу в инклудах?
НУ что ж, Бог помощь. От себя добавлю, что в винде это делается так: в командной строке набираешь, находясь в папке с инклудами:

C++
1
FIND "OpenProcess" *.h > zzz.txt
И через несколько секунд в текстовом файле все упоминания о функции OpenProcess. Делай выводы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2011, 02:13     Поиск всех файлов
Еще ссылки по теме:

#include для всех файлов C++
Как очистить папку от всех файлов C++
C++ Поиск всех файлов в папке и вывод их имен

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
10.09.2011, 02:13     Поиск всех файлов #14
Цитата Сообщение от kravam Посмотреть сообщение
И через несколько секунд в текстовом файле все упоминания о функции OpenProcess. Делай выводы.
херня. я же прежде чем задаться такой мыслью наверное поискал решение уже имеющимися средствами - не нашел. А этот вариант просто выводит все хидеры /usr/include в указанный файл
не заметил вот этого "что в винде это делается так"
Yandex
Объявления
10.09.2011, 02:13     Поиск всех файлов
Ответ Создать тему
Опции темы

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