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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
#1

Получить файлы в папке - C++

25.03.2012, 18:29. Просмотров 1190. Ответов 9
Метки нет (Все метки)

Как получить список всех файлов в папке (можно и включая файлы из поддиректорий) без dirent.h. Желательно winApi
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2012, 18:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить файлы в папке (C++):

файлы в папке - C++
Доброго времяни суток,скажите вот при (создании,поиске)файлов на си ,файл создается и ищется только в папке где находится ехе файл,можно к...

Как переименовать файлы в папке - C++
Есть папка со скриншотами. Необходимо их по порядку переименовать так, чтобы получились такие названия файлов 1.1, 1.2, 2.1, 2.2, 3.1,...

Как удалить все файлы в папке без WinAPI ? - C++
Ну собственно дубль шапки: Как удалить все файлы в папке без WinAPI ? Тоесть на чистом C++ без BOOST, QT и пр и не на последнем...

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

Как получить пусть к папке exe через api - C++
GetModuleFileName даёт полный путь а как узнать папку?копилятор MinGW

Как прочитать последовательно все текстовые файлы лежащие в папке, не зная заранее их имен? - C++
Подскажите плз, как прочитать последовательно все текстовые файлы лежащие в папке, не зная заранее их имен:?

9
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.03.2012, 18:55 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
boost:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
#include <boost/filesystem.hpp>
 
namespace fs = boost::filesystem;
 
int main()
{
   fs::path p = fs::current_path();
   
   std::vector< fs::path > files;
   
   std::copy( fs::directory_iterator(p), fs::directory_iterator(),
                                 std::back_inserter(files) );
   
   
   std::copy( files.begin(), files.end(), 
               std::ostream_iterator< fs::path > (std::cout, "\n") );
}
Результат: http://liveworkspace.org/code/1c77cc...45d696c338519e

Через WinApi можно с помощью FindFirstFile/FindNextFile
3
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.03.2012, 18:59 #3
Mayonez, FindFirstFile затем FindNextFile.

Добавлено через 17 секунд
Цитата Сообщение от Mayonez Посмотреть сообщение
можно и включая файлы из поддиректорий
Рекурсия.
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.03.2012, 20:58 #4
Как получить все файлы в папке
2
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
26.03.2012, 22:58  [ТС] #5
diagon, не подскажите, с какими ключами компилятора компилить этот код (gcc/Mingw)

Добавлено через 1 минуту
вроде бы и построил boost и добавил -LC:\boost_1_49_0\boost_1_49_0\stage\lib
-IC:\boost_1_49_0\boost_1_49_0

а выдает кучу ошибок линковщика
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.03.2012, 23:16 #6
должно работать с опциями -lboost_system -lboost_filesystem
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
26.03.2012, 23:19  [ТС] #7
cannot find -lboost_system -lboost_filesystem
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
26.03.2012, 23: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
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
//Код не мой, а некоего Юры, я его шлифанул
#include <windows.h>
#include <stdio.h>
 
long int rez= 0;
 
void GetFileList(LPTSTR sPath);
 
int main(){
 
//Поскольку sPath и sExt и sEXT одинаковы во всех вызовах GetFileList, их можно было бы сделать
//глобальными, но я так оставил. 
//        char sPath[MAX_PATH]= "E:\\Microsoft_Visual_Studio_9.0";
        char sPath[MAX_PATH]= "E:\\vso_moio";
//        char sPath[MAX_PATH]= "C:\\vso_moio";
//        char sPath[MAX_PATH]= "C:\\vso_moio";
 
//Обратить  внимание на размер массива!
        GetFileList(sPath);
      printf("rez= %d\n", rez);
 
//Портит всё дело: Если перенаправлять в файл с консоли, то полуачается, что в консол ведут 
//запись два разных потока- тот,который нужент и этот,который записывает "Для продлжения нажмите любую
//клавишу" и эта надпись вклинивается в серёдку и портит всё дело
  system ("PAUSE");
}
 
void GetFileList(LPTSTR sPath) {
 
 WIN32_FIND_DATA pFILEDATA;
 
 HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!Необходимо именно здесь прописывать длину пути!!!!!!!!!!!!!!!!!!!!!!!
 sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
//Если пропишем после if (как предлагает Юра), то тогда, если вдруг натыкаемся на системную директорию
// или файл, то FindFirstFile возвращает -1. Следовательно, всё, что выплнняется по условию
//(hFile!=INVALID_HANDLE_VALUE) не выолнится и в частности, не будет поставлен конец строки!
//А это значит, что по выходу из  рекурсивной функции GetFileList в том месте, где мы восстанавливаем
//Длину, она будет восстановлена неправильно
 if (hFile!=INVALID_HANDLE_VALUE)    {
  char * chBuf;
  //sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
  do {
   //Пропускаем . и ..
   if (strlen(pFILEDATA.cFileName) == 1 &&  strchr(pFILEDATA.cFileName,'.') !=NULL)
    if (FindNextFile(hFile,&pFILEDATA) == 0)
      break;
   if (strlen(pFILEDATA.cFileName) == 2 && strstr(pFILEDATA.cFileName,"..") !=NULL)
    if(FindNextFile(hFile,&pFILEDATA) == 0)
      break;
     //Если нашли директорию, запускаем поиск в ней рекурсивный поиск
   if(pFILEDATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     GetFileList(strcat(sPath,pFILEDATA.cFileName));
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
     sPath[strlen(sPath) - strlen(pFILEDATA.cFileName)- 1] = '\0';
   }
   else {
    //Проверяем на соотвествие sExt расширения pFILEDATA.cFileName
//    if((chBuf = strrchr(pFILEDATA.cFileName,'.'))) {
//     if((!strcmp(chBuf + 1,sExt))|| (!strcmp(chBuf + 1,sEXT))) {
      //Если не будем использовать CharToOem() то на экране русский шрифт каракулями выйдет
      CharToOem(sPath,sPath);
      printf("%s",sPath);
      OemToChar(sPath,sPath);
      CharToOem(pFILEDATA.cFileName,pFILEDATA.cFileName);
      printf("%s\n",pFILEDATA.cFileName);
      rez++;
//     }
//    }
   }
  }
  while (FindNextFile(hFile,&pFILEDATA));
 }
}
3
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
27.03.2012, 00:14  [ТС] #9
ок, а boost?
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
27.03.2012, 07:06 #10
Цитата Сообщение от Mayonez Посмотреть сообщение
diagon, не подскажите, с какими ключами компилятора компилить этот код (gcc/Mingw)
У меня тоже с этим проблемы были, единственное решение, которое я нашел - указывать либы напрямую(точнее я забиваю эти либы в IDE, и она сама их подставляет). Т.е. в моем случае код нормально компилируется так:
Код
g++ main.cpp -IC:\Boost\include\boost-1_48 C:\Boost\lib\libboost_filesystem-mgw46-mt-sd-_48.a C:\boost\lib\libboost_system-mgw46-mt-sd-1_48.a -static
P.S. чтобы в моем коде захватывались также подкаталоги, нужно всего лишь заменить directory_iterator на recursive_directory_iterator.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2012, 07:06
Привет! Вот еще темы с ответами:

Файлы. Получить значения функции , вычисленной с заданной точностью e - C++
В бинарном файле записаны вещественные числа. Получить значения функции , вычисленной с заданной точностью e, для каждого числа,...

Файлы CPP, HPP как получить файл exe - C++
Как все это сделать на DEV-C++?

Как получить все папки и файлы хранящиеся на диске? - C++
Здравствуйте! Помогите пожалуйста в написании кода, с помошью которого можно получить все папки и файлы хранящиеся на диске D: ...

Файлы. Получить слово, образованное k-ыми символами каждой строки - C++
Здравствуйте, ребята! Вот задание: Дан текстовый файл. Получить слово, образованное k-ыми символами каждой строки. У меня не получается...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
27.03.2012, 07:06
Ответ Создать тему
Опции темы

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