Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
ganjawar
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 40
#1

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

09.09.2011, 22:45. Просмотров 1328. Ответов 13
Метки нет (Все метки)

Здравствуйте
Задача кода найти все файлы в папке,для их дальнейшего использования
Код такой:
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) внутри оказываются иероглифы, и как Я понял не распознается путь,в чем проблема?или может помимо этого есть еще ошибки?
Спасибо за внимание
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2011, 22:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск всех файлов (C++):

Реализовать поиск в указанном каталоге всех файлов во всех поддиректориях и сформировать XML в нужном формате - C++
Задача: Искать в указанном каталоге все файлы во всех поддиректориях и формировать XML в нужном формате. XML записать в директорию...

Поиск всех файлов в папке и вывод их имен - C++
Пытаюсь сделать программку, которая будет выводить название всех файлов формата .txt в определенной папке, но что-то не могу разобраться с...

Обход всех файлов в каталоге - C++
Всем привет! Необходимо получить список файлов заданного расширения (например, txt) в заданной директории. Каждый файл я буду открывать...

Обход всех файлов в каталоге - C++
Ребята помогите открыть все файлы по пути, не зная их. Например чтобы пройтись по всем файлам на локальном диске D. В visual studio,...

#include для всех файлов - C++
Здравствуйте, можно ли подключить любую библиотеку с помощью #include сразу для всех файлов в проекте? Т.е. не описывать тот же...

Получение всех текстовых файлов из папки - C++
Всем привет. Можно ли на с++ написать программу, в которой ты вводишь полный путь до какой-то папки, далее вводишь расширение файлов...

13
villu
203 / 204 / 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.
0
ganjawar
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 40
10.09.2011, 00:15  [ТС] #3
Какой способ лучше выбрать?
использовать функцию FindFirstA?
или wchar?
если есть возможность,то исправьте нужные строки кода,иначе будет много нубовских вопросов)
0
villu
203 / 204 / 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);
0
ganjawar
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 40
10.09.2011, 00:29  [ТС] #5
Спасибо за помощь,но при отладке в переменной DirSpec непонятные символы [] и при wprintf(DirSpec) они и выводятся и получается что путь ен правильный..Но ошибок компилятор не выдает,уже хорошо
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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 ();
}
0
alkagolik
Заблокирован
10.09.2011, 01:12 #7
А как подобное можно сделать в *NIX? Я уже давно хочу себе такую утилитку, но не знаю как сделать вот что:
1. организовать обход дерева директорий(и поддиректорий)
2. идентифицировать заранее неизвестный файл (т.е. не могу же я указать в коде 2000 имен файлов, а перебрать надо все)
алгоритмически тут конечно не сложно, может кто вспомнит для меня какие API - шные функции?
Да и времени совсем нету.
0
asics
Freelance
Эксперт С++
2850 / 1785 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
10.09.2011, 01:14 #8
Цитата Сообщение от alkagolik Посмотреть сообщение
1. организовать обход дерева директорий(и поддиректорий)
http://www.cyberforum.ru/cpp-cross-platform/thread345596.html
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
10.09.2011, 01:15 #9
Так тебе по юникс или под винду?
0
ganjawar
0 / 0 / 0
Регистрация: 09.09.2011
Сообщений: 40
10.09.2011, 01:27  [ТС] #10
kravam Спасибо!Мне надо было под винду,но и под юникс тоже надо будет потом,если есть что посоветовать то буду благодарен

Добавлено через 4 минуты
и еще одни вопрос.Как Мне сделать ввод своего пути в переменную и отправить вместо пути "c:\\*"
ошибка с преобразованием типов((
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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 ();
}
0
alkagolik
Заблокирован
10.09.2011, 01:55 #12
Цитата Сообщение от kravam Посмотреть сообщение
Так тебе по юникс или под винду?
linux
Я очень часто подолгу заморачиваюсь в поисках той или иной функции\константы при написании\изучении программ и пришел к выводу что было бы неплохо иметь утилитку с ключом - искомой строковой\символьной фразой и корнем директорий /usr/include ну товарищ выше ссылку кинул, мысль понятна: создать вектор файлов. а как эти файлы поместить в вектор без прямого указания filename это пока загадка.

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

C++
1
FIND "OpenProcess" *.h > zzz.txt
И через несколько секунд в текстовом файле все упоминания о функции OpenProcess. Делай выводы.
0
alkagolik
Заблокирован
10.09.2011, 02:13 #14
Цитата Сообщение от kravam Посмотреть сообщение
И через несколько секунд в текстовом файле все упоминания о функции OpenProcess. Делай выводы.
херня. я же прежде чем задаться такой мыслью наверное поискал решение уже имеющимися средствами - не нашел. А этот вариант просто выводит все хидеры /usr/include в указанный файл
не заметил вот этого "что в винде это делается так"
0
10.09.2011, 02:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2011, 02:13
Привет! Вот еще темы с ответами:

Как очистить папку от всех файлов - C++
Возник такой вопрос: как очистить папку от всех файлов, то бишь удалить все внутри папки, кроме самой папки? Я поискал немного информации...

Поиск файлов С++ - C++
Помогите плиз поправить код!!! Т.е чтоб прога выводила все текстовики в данном каталоге!!! #include&lt;iostream&gt; #include &lt;windows.h&gt; ...

Поиск файлов - C++
Вот решил перейти к изучению C++ после Delphi, интерисует как найти все файлы в папке :) Готовый код или ссылки, буду рад всему :)

Поиск файлов - C++
Помогите хотя бы в теории понять, возможен ли поиск файлов без использования функций библиотеки windows.h вообще, и как его можно...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.