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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

Как считать имена файлов из директории? - C++

16.11.2013, 16:03. Просмотров 2161. Ответов 12
Метки нет (Все метки)

Здорова господа!!!

Есть директория, в ней находятся файлы, нужно получить массив с названиями этих файлов и еще определять где файл, а где директория.

От в пхп это делается легко функция scandir() принимает путь к директории и на выходе возвращает массив с именами файлов всей директории, также лего проверить файл это или нет функцией file_exests() передаем имя если true, то файл не true, то скорее директория.

Как это все сделать в С++ под виндовс???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2013, 16:03     Как считать имена файлов из директории?
Посмотрите здесь:
C++ Вывести список всех файлов из указанной директории, имена которых содержат русские буквы
Как вручную ввести полные имена файлов что бы потом считать/записать информацию с них/на них? C++
Как получить названия файлов в конкретной директории C++
C++ Как, при запуске консольной программы, передать в нее имена файлов?
C++ Как, при запуске консольной программы, передать в нее имена файлов?
Сравнить содержимое файлов между собой, и если оно совпадает, то вывести на экран имена этих файлов C++
Как считать данные из 3 разных файлов случайным образом? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ПерС
371 / 287 / 89
Регистрация: 05.11.2013
Сообщений: 820
Записей в блоге: 5
Завершенные тесты: 1
16.11.2013, 16:11     Как считать имена файлов из директории? #2
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
#include <stdio.h>
#include <dos.h>
#include <dir.h>
int main(void) {
   struct ffblk ffblk;
   int done;
   printf("Directory listing of *.*\n");
   done = findfirst("*.*",&ffblk,
    FA_ARCH|FA_DIREC);
   while (!done) {
    unsigned t=ffblk.ff_ftime;
    char s=(t&0x001F)<<1, m=(t&0x07E0)>>5,
     h=(t&0xF800)>>11;
    t=ffblk.ff_fdate;
    char d=(t&0x001F), mon=(t&0x01E0)>>5;
    int y=(t&0xFE00)>>9;
        printf("%s %15ld \
%02d/%02d/%4d,%02d:%02d:%02d\n",
     ffblk.ff_name,ffblk.ff_fsize,
     d,mon,y+1980,h,m,s);
    done = findnext(&ffblk);
   }
  getchar(); return 0;
}
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.11.2013, 21:48  [ТС]     Как считать имена файлов из директории? #3
ПерС, Не работает, ошибка не удается открыть <dir.h> файла нету.

Добавлено через 5 часов 2 минуты
Ладно я так смотрю вы не поняли что нужно сделать. Есть директория, мне нужно считать ее содержимое, имена файлов и записать в текстовый файл. Как считать содержимое директории???

Добавлено через 19 минут
От нашол функцию, но ничего не ясно как она работает, похоже функция из винапи.
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
#include <iostream>
using std::cout;
using std::endl;
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
 
void main()
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;
 
 
   hFind = FindFirstFile(L"Debug", &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFile failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
       cout <<"mu tyt"<<endl;
      _tprintf (TEXT("The first file found is %s\n"), 
                FindFileData.cFileName);
      FindClose(hFind);
   }
}
Вообще не понятно что это за переменные, ясно что возвращает объект типа WIN32_FIND_DATA, но как мне из этого объекта вытянуть содержимое директории? Метод похоже cFileName() возвращает имя самой директории ну я пробовал вывело имя директории. МСДН тяжело читать, там все на английском, да и еще без предворительной подготовки, мб на русском есть какой нить хороший МСДН??

Добавлено через 1 минуту
Мне вообще весь МСДН и нафиг не нужно, нужно только получить содержимое директории, наверно одну функцию понять как использовать, мб кто разьяснит?!

Добавлено через 3 минуты
Вообще этот объект ни понятно что описывает, в описании вроде написано что файл описывает, ну и структуру если посмотреть то выходит что файл, ну а как так? Я ж туда вроде путь к директории передал?

Добавлено через 6 минут
И почему у меня срабатывает антивирус, я от пытаюсь вывести содержимое объекта WIN32_FIND_DATA и у меня срабатывает антивируст? Вот код:
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 <iostream>
using std::cout;
using std::endl;
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
 
void main()
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;
 
 
   hFind = FindFirstFile(L"Debug/", &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFile failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
       cout <<"mu tyt"<<endl;
    //  _tprintf (TEXT("The first file found is %s\n"), 
    //            FindFileData.cFileName);
      cout <<"FindFileData.cFileName= "<<FindFileData.cFileName<<endl;
      FindClose(hFind);
   }
}
Срабатывает антивирус: Avast! Экран файловой системы блокировал угрозу. Дополнительные действия не требуются.
Байт
Эксперт C
15632 / 9974 / 1499
Регистрация: 24.12.2010
Сообщений: 18,710
16.11.2013, 21:52     Как считать имена файлов из директории? #4
Все зависит от ОСи. Вот, в ДОСе есть такая сладкая парочка findfist-findnext. Windows, кажись, тоже поддерживает.
У самой Винд-Апи тоже полно аналогичных штук, даже названия те же, но большими буквами. У Qt вообще все хорошо в классе QDir. Ну а если Ось другая и кросса не ищите - "пилите, Шура, они внутри - золотые"
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
16.11.2013, 21:57     Как считать имена файлов из директории? #5
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
#include <windows.h>
#include <iostream>
#include <string>
 
using namespace std;
 
void main()
{
 
string Path = "C:\\";       //  .
 
 
 
    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
 
    hf=FindFirstFile("C:\\*.txt", &FindFileData);
 
    //        .txt.
 
 
    if (hf!=INVALID_HANDLE_VALUE)
    {
        do
        {  
 
        Path  += FindFileData.cFileName;                        //   .
        cout << "Path file:  "<<Path.c_str()<<endl;             //  .
        cout << "Name file:  "<<FindFileData.cFileName<< endl;  //  .
/*      .   */       
        Path = "C:\\";   // .
 
        cout<<endl;
        }
 
        while (FindNextFile(hf,&FindFileData)!=0);
 
 
        FindClose(hf);
    }
 
 
 
system("pause");
}
 // [url]http://www.cyberforum.ru/visual-cpp/thread144752.html[/url]
Работа с каталогами

Добавлено через 3 минуты
Наверное, не совсем то....
Байт
Эксперт C
15632 / 9974 / 1499
Регистрация: 24.12.2010
Сообщений: 18,710
16.11.2013, 21:57     Как считать имена файлов из директории? #6
Цитата Сообщение от ninja2 Посмотреть сообщение
Срабатывает антивирус: Avast! Экран файловой системы блокировал угрозу.
Я бы тоже на его месте заблокировал. Чего это в мою файловую систему лезешь? Это называется "параноидальный режим работы антивируса". Либо установи его в другой режим, либо выключи на время этой работы.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.11.2013, 22:45  [ТС]     Как считать имена файлов из директории? #7
katsidelin, Ну я твой пример чуток переделал, у меня просто строки string с ними не работает, пришлось на wstring поменять, отак:
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
#include <windows.h>
#include <iostream>
#include <string>
 
using namespace std;
 
void main()
{
 
wstring Path = L"C:\\";       //  .
 
 
 
    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
 
    hf=FindFirstFile(L"C:\\*", &FindFileData);
 
    //        .txt.
 
 
    if (hf!=INVALID_HANDLE_VALUE)
    {
        do
        {  
 
        Path  += FindFileData.cFileName;                        //   .
        wcout << L"Path file:  "<<Path.c_str()<<endl;             //  .
        wcout << L"Name file:  "<<FindFileData.cFileName<< endl;  //  .
/*      .   */       
        Path = L"C:\\";   // .
 
        cout<<endl;
        }
 
        while (FindNextFile(hf,&FindFileData)!=0);
 
 
        FindClose(hf);
    }
 
 cout <<"mu tyt"<<endl;
 
//system("pause");
}
 // [url]http://www.cyberforum.ru/visual-cpp/thread144752.html[/url]
А мб кто знает, что в настройках поменять что б string были как wstring ну или как то переводить из wstring в string. У меня в проекте кругом используется string, wstring я раз только использовал это при создании директории, ну и там при выборе случайного имени директории, ну я неудобно сделал в двух вариантах имя генерировал один в string, а другой в wstring, и тут же с имена файлов у меня похоже будут записаны в wstring, что бы перевести их в string походу наверно мне нужно их сохранить в файл, а затем считать уже файловым потоком для string, скорее всего я получу имена в string, но мб есть какой нить более лучший способ, мб нужно было изначально как то по другому проект строить???

Просветите новичка как правильно проект нужно было строить!!! Конечно сохранить строки wstring в файл, а затем считать в string мб тоже вариант, а если оно не правильно считает, я не пробовал, как вообще правильно нужно было делать???

Добавлено через 3 минуты
Я от помню что мне советовали в настройках поменять где то что то и тогда вроде как строки string станут wstring и проблем не будет, среда visual studio 2010!!!

Добавлено через 23 минуты
Ну от господа все таки подтвердилось, что бы получить из wstring string нужно просто записать в файл данные а уже оттуда их считать в string
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 <string>
#include <vector>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
void main()
{
 
wstring Path = L"C:\\";       //  .
 
 
 
    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
 
    hf=FindFirstFile(L"C:\\*", &FindFileData);
 
    //        .txt.
 
    vector<string> v;
    if (hf!=INVALID_HANDLE_VALUE)
    {
        do
        {  
            wofstream wifs("temp.txt",wifstream::out);
        Path  += FindFileData.cFileName;                        //   .
        wcout << L"Path file:  "<<Path.c_str()<<endl;             //  .
        wcout << L"Name file:  "<<FindFileData.cFileName<< endl;  //  .
        wifs <<FindFileData.cFileName;
        wifs.close();
        ifstream ifs("temp.txt",ifstream::in);
        if(!ifs){cerr<<"don't open file"<<endl;exit(1);}
        string s="";
        ifs >>s;
        ifs.close();
        v.push_back(s);
/*      .   */       
        Path = L"C:\\";   // .
 
        cout<<endl;
        }
 
        while (FindNextFile(hf,&FindFileData)!=0);
 
 
        FindClose(hf);
    }
 
 cout <<"mu tyt"<<endl;
 cout <<"v.size()= "<<v.size()<<endl;
 for(int i=0;i<v.size();i++)
     cout <<v[i]<<endl;
//system("pause");
}
 // [url]http://www.cyberforum.ru/visual-cpp/thread144752.html[/url]
Это способ перевода из wstring в string ну и наверно наоборот. Да можно функции две создать string_to_wstring() и wstring_to_string() которые будут переводить одни строки в другие используя временный файл. В принципе для моего проекта этот вариант годиться. Но мб есть какое нить более лучшее "правильное" решение, чо то меня смущает что оно все так запутано получается и мой код как всегда получается такой что другой человек в нем не разберется, я сам в нем с трудом разбираюсь на следующий день, там 700 строк кода и я уже смотрю его тяжело читать, а если не знающий человек будет смотреть, то он фиг в нем разберется, не разобраться он то разберется только придется затратить день - три дня на разбор, а мб для кого то и больше, короче гамно код получается на С++, я щас код пхп на С++ переписываю, так код на пхп я писал полтора года назад и то в нем быстро разобрался наверно потому что язык высокоуровневый, а от на С++ все плохо получается.

А ForEveR что то советовал, там как то проект настроить для строк, я так и не понял.

Добавлено через 53 секунды
Давайте господа подумаем как же нам писать более менее читаемый код!!!!
Байт
Эксперт C
15632 / 9974 / 1499
Регистрация: 24.12.2010
Сообщений: 18,710
16.11.2013, 22:58     Как считать имена файлов из директории? #8
Цитата Сообщение от ninja2 Посмотреть сообщение
Давайте господа подумаем как же нам писать более менее читаемый код!!!!
Очень интересное предложение! Давайте все, господа, подумаем над твоим кодом! Ты. наверное. думаешь. что нам своих кодов не хватает?
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.11.2013, 23:02  [ТС]     Как считать имена файлов из директории? #9
Цитата Сообщение от Байт Посмотреть сообщение
Очень интересное предложение! Давайте все, господа, подумаем над твоим кодом! Ты. наверное. думаешь. что нам своих кодов не хватает?
Ну мне мой код если честно уже надоел, у меня скорость написания маленькая я от строк 100 - 200 в день пишу, бывает 300-400 ну это редко в основном средняя скорость 100 строк в день, от интересно вы тоже так же мало пишите? (это я уже подметил)
Байт
Эксперт C
15632 / 9974 / 1499
Регистрация: 24.12.2010
Сообщений: 18,710
17.11.2013, 00:31     Как считать имена файлов из директории? #10
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну мне мой код если честно уже надоел,
А мне, думаешь, еще нет?
Цитата Сообщение от ninja2 Посмотреть сообщение
у меня скорость написания маленькая я от строк 100 - 200 в день пишу
Это показатель новичка. Серьезный кодер редко когда более 20 строк в день пишет. Ну конечно, не считая копипаста. Но и даже копипастируя, пытается понять, а нет ли тут твоей (моей) неправоты.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.11.2013, 01:21  [ТС]     Как считать имена файлов из директории? #11
Цитата Сообщение от Байт Посмотреть сообщение
Это показатель новичка. Серьезный кодер редко когда более 20 строк в день пишет. Ну конечно, не считая копипаста. Но и даже копипастируя, пытается понять, а нет ли тут твоей (моей) неправоты.
Ну у меня тоже бывает и 20 получается это когда ленюсь, а так среднее примерно сотка, а я думал я так мало пишу потому что навичок, думал настоящий кодер строк 500 - 1к создает .
ForEveR
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
17.11.2013, 01:35     Как считать имена файлов из директории? #12
ninja2, "Настоящий кодер" "создает" столько строк, сколько требует задача. Чаще всего, после того как подумает КАК эту задачу реализовать.
А на тему конкретной задачи пожалуй как-то так

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 <iostream>
#include <string>
#include <vector>
#include <boost/filesystem.hpp>
 
int main(int argc, char* argv[]) {
    namespace fs = boost::filesystem;
    if (argc < 2)
    {
        std::cerr << "Usage: program directory" << std::endl;
        return 1;
    }
    struct path_info
    {
        path_ino(const std::string& p, bool is) :
        path(p), is_directory(is) {}
        std::string path;
        bool is_directory;
    };
    fs::path path(argv[1]);
    std::vector<path_info> result;
    for (fs::directory_iterator pos(path); pos != fs::directory_iterator(); ++pos)
    {
        const fs::path& cur_path = pos->path();
        result.emplace_back(cur_path.string(), fs::is_directory(cur_path));
    }
    return 0;
}
Написано на коленке, на компилируемость не проверял, но приблизительно так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2013, 12:33     Как считать имена файлов из директории?
Еще ссылки по теме:
C++ Как изменить обычные имена массивов на имена с указателями?
имена файлов C++
C++ Список файлов в директории
C++ Поиск файлов в директории
C++ Поиск файлов в директории

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

Или воспользуйтесь поиском по форуму:
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.11.2013, 12:33  [ТС]     Как считать имена файлов из директории? #13
А как определить все файлы с расширением?
От это выражение ищет все текстовые файлы "C:\\*.txt", если я делаю так "С:\\*.*" то нифига не происходит все рамно и каталоги попадаются это выражение равносильно "С:\\*".
Как найти в директории все файлы с расширениями, а каталоги не искать???

Или ладно я нашол все файлы с директориями "С:\\*" раз выражением не получается найти отдельно все файлы, теперь как определить что есть файл, а что директория???

Добавлено через 12 минут
Ладно поиском не получается, но там в виндовс каждая папка и файл имеет свои атрибуды, просто проверять эти атрибуты на каталог и все.

Добавлено через 39 секунд
Плюс каталоги которые системой используются не считаются обычными каталогами, короче имеют свой атрибут.

Добавлено через 3 минуты
Плюс МСДН на русском нашол, неплохо так переведено http://www.vsokovikov.narod.ru/ , добавил в закладки.
Yandex
Объявления
17.11.2013, 12:33     Как считать имена файлов из директории?
Ответ Создать тему
Опции темы

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