Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как получить все файлы в папке?


Автор: Ortistx 25.4.2011, 22:13
Здравствуйте.

Создаю консольное приложение в MS Visual Studio. На данном этапе разработки программы необходимо:
после ввода пути к папке в качестве параметра, определить какие файлы находятся в данной папке.

Собственно вопрос. Как можно получить список файлов, которые находятся в папке?

Заранее спасибо.

Автор: bsa 25.4.2011, 22:28
FindFirstFile/FindNextFile

Автор: Ortistx 27.4.2011, 21:31
Спасибо.

Но компилятор ругается на строчку hFind = FindFirstFile("C:\\Windows\\*.exe", &FindData);
Error    1    error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char [17]' to 'LPCWSTR'    D:\CPP\find_dile\find_dile\find.cpp    19
Error    2    IntelliSense: argument of type "const char *" is incompatible with parameter of type "LPCWSTR"    d:\cpp\find_dile\find_dile\find.cpp    19

Автор: boostcoder 27.4.2011, 21:41
FindFirstFile(L"C:\\Windows\\*.exe", &FindData);

Автор: Ortistx 27.4.2011, 22:01
Спасибо большое. Получилось.

А Вы могли бы объяснить что делает "L"? и где об этом преобразовании можно почитать?

Добавлено через 2 минуты и 17 секунд
Нет, не получилось. Почему-то вместо имени файлов выводятся адреса...

Автор: boostcoder 27.4.2011, 22:25
Цитата(Ortistx @  27.4.2011,  22:01 Найти цитируемый пост)
вместо имени файлов выводятся адреса

потому что ты юникодную строку пытаешься вывести в стандартный поток? ;)

Автор: Ortistx 27.4.2011, 22:27
А как надо сделать?

Что делает буковка L?
Надо перед выводом преобразовать строку как-то?

Автор: boostcoder 27.4.2011, 23:01
Цитата(Ortistx @  27.4.2011,  22:27 Найти цитируемый пост)
А как надо сделать?

покажи как выводишь.

Цитата(Ortistx @  27.4.2011,  22:27 Найти цитируемый пост)
Что делает буковка L?

это: http://en.wikibooks.org/wiki/Windows_Programming/Unicode

Автор: Ortistx 27.4.2011, 23:07
Собственно вот моя программа:

Код

int main()
{
    
    FILE *j;
    j=fopen("1.txt","w");
    WIN32_FIND_DATA FindFileData;
    HANDLE hf;



    hf=FindFirstFile(L"D:\\a\\*.exe", &FindFileData);
    if (hf!=INVALID_HANDLE_VALUE)
    {
        do
        {
            cout << FindFileData.cFileName << endl;
        }
        while (FindNextFile(hf,&FindFileData)!=0);
        FindClose(hf);
    }

    return 0;
}



В папке "a" лежит 5 файлов. Он мне почему-то выводит 5 одинаковых строчек (хотя имена файлов естественно разные):
0039F77C
0039F77C
0039F77C
0039F77C
0039F77C

Вообще мне все названия файлов нужно будет сохранить куда-нибудь, например в строковый массив. Хотя размер его неизвестен будет...Как тут лучше поступить? Куда записать имена файлов, чтобы потом с ними можно было бы работать как со строками?

Автор: boostcoder 27.4.2011, 23:14
во первых - в опциях проекта отключи поддержку юникода. так: http://clip2net.com/clip/m47996/1303935165-cliptt2979-27kb.png
во вторых - список файлов можно хранить в std::http://cplusplus.com/reference/stl/vector/<std::http://cplusplus.com/reference/string/string/>

Автор: Ortistx 27.4.2011, 23:21
Отключил, получилось, показывает список файлов. Спасибо.

А лучше во всех проектах по умолчанию отключать поддержку юникода?

Автор: boostcoder 27.4.2011, 23:38
Цитата(Ortistx @  27.4.2011,  23:21 Найти цитируемый пост)
лучше во всех проектах по умолчанию отключать поддержку юникода? 

очень зависит.

Автор: bsa 28.4.2011, 10:34
Цитата(Ortistx @  27.4.2011,  23:21 Найти цитируемый пост)
А лучше во всех проектах по умолчанию отключать поддержку юникода? 

Лучше писать сразу юникодовые программы и не париться (большинство функций WinAPI, работающих со строками, имеют две версии FunctionA и FunctionW, а так же макрос Function, который в зависимости от настроек, заменяется FunctionA или FunctionW; так же есть макросы _tmain - замена main(), TCHAR - замена char, _TEXT("<строка>") или _T('<символ>') - преобразования строки/символа в юникод по необходимости).
А в твоей программе следует использовать _findfirst/_findnext, чтобы не заморачиваться.

Автор: xvr 28.4.2011, 11:21
Цитата(Ortistx @  27.4.2011,  21:31 Найти цитируемый пост)
Error    1    error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char [17]' to 'LPCWSTR'    D:\CPP\find_dile\find_dile\find.cpp    19
Error    2    IntelliSense: argument of type "const char *" is incompatible with parameter of type "LPCWSTR"    d:\cpp\find_dile\find_dile\find.cpp    19

Ау, модераторы! А можно, куда нибудь в шапку раздела прибить большими гвоздями -
Цитата


Если у вас компилятор ругается на строки, переданные в вызовы API, и требует что то вроде LPCWSTR -
отключите поддержку Unicode в проекте!


А то достало уже, честное слово. Каждая 5я тема об этом  smile 

Автор: bsa 28.4.2011, 11:44
xvr, создай соответствующую тему - прикреплю

Автор: Ortistx 28.4.2011, 15:56
Я слышал такое мнение, что отключать поддержку юникода - плохой тон.

Цитата(bsa)

 так же есть макросы _tmain - замена main(), TCHAR - замена char, _TEXT("<строка>") или _T('<символ>')

У меня на все это компилятор ругается. Надо что-то подключать?

Автор: bsa 28.4.2011, 15:59
#include <windows.h>

Автор: Ortistx 28.4.2011, 16:00
Подключил его. Может это из-за того, что приложение консольное?

Автор: bsa 28.4.2011, 16:03
Ortistx, http://msdn.microsoft.com/ru-ru/library/c426s321.aspx

Автор: Ortistx 28.4.2011, 17:06
bsa, спасибо.


Попробовал использовать _findfirst и _findnext. Не получилось. Выводит имя только 1 файла. Почему так? Вот код:

Код

int main()
{
    
    _finddata_t data;

    int nFind = _findfirst("D:\\a\\*.exe",&data);
    cout<<data.name;

    while(!nFind)
    {
    nFind = _findnext(nFind, &data);
    cout<<data.name;
    }

    if (nFind != -1) {

     

        _findclose(nFind);

          }
          
    return 0;
}

Автор: xvr 28.4.2011, 19:51
Цитата(Ortistx @  28.4.2011,  17:06 Найти цитируемый пост)
Почему так? 
Вы описание на _findfirst/_findnext читали? Видимо нет  smile 

Код

int main()
{
    
    _finddata_t data;
    int nFind = _findfirst("D:\\a\\*.exe",&data);
    if (nFind !=-1)
     {
      do {
       cout<<data.name;
      }
      while(!_findnext(nFind, &data));
      _findclose(nFind);
    }
          
    return 0;
}

Автор: Ortistx 28.4.2011, 21:10
Да, спасибо, уже прочитал и разобрался smile

Программа получилась, всем спасибо за помощь! smile 

Автор: bsa 29.4.2011, 11:12

M
bsa
Ortistx, если ответ на вопрос получен, то пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)