adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
Как получить список имён файлов в текущей директории в С++
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
BS
Эксперт
СообщениеДобавлено: Вс 15-07-07 : 16-43    Заголовок сообщения: Как получить список имён файлов в текущей директории в С++ Ответить с цитатой

Список файлов и папа. Подскажите...
И как перемещатся в папках?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
perf
Продвинутый форумчанин
СообщениеДобавлено: Вс 15-07-07 : 22-07    Заголовок сообщения: Ответить с цитатой

тут нужно указывать не язык, а ос.
если виндовс, то надо юзать FindFirstFile/FindNextFile из ее api.
см. msdn.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Отправить e-mail  
BS
Эксперт
СообщениеДобавлено: Вс 15-07-07 : 22-18    Заголовок сообщения: Ответить с цитатой

ОС, Виноус. Я для консольки хочу. МСДН нет. Просто можно простой пример, плиз?
То, что надо юзать подобные методы я уже понял. Нашёл в справки к борлан си. Но писать буду под MVS 2003.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
perf
Продвинутый форумчанин
СообщениеДобавлено: Пн 16-07-07 : 22-40    Заголовок сообщения: Ответить с цитатой

BS писал(а):
МСДН нет.

очень плохо, там даже пример кода есть.
Код:

#define _WIN32_WINNT 0x0501

#include <windows.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   char DirSpec[MAX_PATH];  // directory specification
   DWORD dwError;

   printf ("Target directory is %s.\n", argv[1]);
   strncpy (DirSpec, argv[1], strlen(argv[1])+1);
   strncat (DirSpec, "\\*", 3);

   hFind = FindFirstFile(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);
}


другой вариант:
Код:

WIN32_FIND_DATA findData;
HANDLE hFind = FindFirstFile("c:\\", &findData);
if (hFind != INVALID_HANDLE_VALUE)
{
   BOOL moreFiles = FALSE;

   do
   {
      // attributes chars
      char dir = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? 'd' : '-');
      char hidden = (findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ? 'h' : '-');
      char readonly = (findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY ? 'r' : '-');
      const char* name = findData.cFileName;

      // print out
      printf("%c%c%c   %s\r\n", dir, hidden, readonly, name);

      // move next
      moreFiles = FindNextFile(hFind, &findData);
   }
   while (moreFiles);

   FindClose(hFind);
}

 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Отправить e-mail  
BS
Эксперт
СообщениеДобавлено: Вт 17-07-07 : 09-16    Заголовок сообщения: Ответить с цитатой

Большое спасибо!
Сегодня вечром попобую!
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Darvik
Форумчанин
СообщениеДобавлено: Вт 17-07-07 : 09-22    Заголовок сообщения: Ответить с цитатой

Есть интернет но нет msdn - ставим твердую два
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Ср 18-07-07 : 21-30    Заголовок сообщения: Ответить с цитатой

Я предпочёл первый вариант кода. Он более прост, с точки зрения понимания. Кстати в нём есть вде смертельные ошибки. Обошёл их и заставил его работать для себя. Спасиб, perf!
Darvik
Критиковать может каждый.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Ср 18-07-07 : 21-31    Заголовок сообщения: Ответить с цитатой

А как отличать файлы от папок???
Не у всех файлов есть расширения.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
perf
Продвинутый форумчанин
СообщениеДобавлено: Ср 18-07-07 : 22-16    Заголовок сообщения: Ответить с цитатой

отправная точка
http://msdn2.microsoft.com/EN-US/library/aa364418.aspx

BS писал(а):
А как отличать файлы от папок???

второй пример смотрел невнимательно
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Отправить e-mail  
BS
Эксперт
СообщениеДобавлено: Ср 18-07-07 : 22-23    Заголовок сообщения: Ответить с цитатой

Получилось, кстати, вот что



#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>

struct FileList
{
char fileName[256];
FileList *next;
};
void addToList(FileList *&head, char str[])
{
FileList *tmp=NULL;
tmp=(FileList *)malloc(sizeof(FileList));
strcpy(tmp->fileName,str);
tmp->next=head;
head=tmp;
}
FileList *getFileNameList(char const folder[])//Надо подавать адрес до папки без последнего /, например C:\temp
{
FileList *head;
////////////////////////////////////////
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char DirSpec[256]; // directory specification
DWORD dwError;
strcpy(DirSpec,folder);
int lenth=strlen(DirSpec);
DirSpec[lenth]='\\';
DirSpec[lenth+1]='*';
DirSpec[lenth+2]=0;



hFind = FindFirstFile(DirSpec, &FindFileData);

if (hFind == INVALID_HANDLE_VALUE)
{
printf ("Invalid file handle. Error is %u\n", GetLastError());
return NULL;
}
else
{
//printf ("First file name is %s\n", FindFileData.cFileName);
head=(FileList*)malloc(sizeof(FileList));
head->next=NULL;
strcpy(head->fileName,FindFileData.cFileName);

while (FindNextFile(hFind, &FindFileData) != 0)
{
//printf ("Next file name is %s\n", FindFileData.cFileName);
addToList(head,FindFileData.cFileName);
}

dwError = GetLastError();
FindClose(hFind);
if (dwError != ERROR_NO_MORE_FILES)
{
printf ("FindNextFile error. Error is %u\n", dwError);
return NULL;
}
}
////////////////////////////////////////
return head;
}
int main(int argc, char *argv[])
{
FileList *head=getFileNameList("C:\\Temp");


return (0);
}


т.е. берём указателю присваеваем получить список файлов(и папок, как я понял) и даём в аргумент каталог. Указатель будет на ноль, еслис это не удалось.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
perf
Продвинутый форумчанин
СообщениеДобавлено: Ср 18-07-07 : 22-25    Заголовок сообщения: Ответить с цитатой

BS
используй тэги code с сохранением форматирования кода
разбираться в этой каше желания нет
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Отправить e-mail  
perf
Продвинутый форумчанин
СообщениеДобавлено: Ср 18-07-07 : 22-52    Заголовок сообщения: Ответить с цитатой

BS писал(а):
Получилось, кстати, вот что

жесковато конечно

вариант попроще
Код:

#include <windows.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <algorithm>

typedef std::vector<std::string> StringVector;

void getFileNameList(std::string path, StringVector* fileList)
{
   WIN32_FIND_DATA findData;
   HANDLE hFind = FindFirstFile(path.c_str(), &findData);
   if (hFind != INVALID_HANDLE_VALUE)
   {
      BOOL moreFiles = TRUE;

      while (moreFiles)
      {
         const char* name = findData.cFileName;
         fileList->push_back(name);

         // move next
         moreFiles = FindNextFile(hFind, &findData);
      }

      FindClose(hFind);
   }
}

int print_string(std::string str)
{
   printf("%s\r\n", str.c_str());
   return 0;
}

int main(int argc, char *argv[])
{
   StringVector fileList;

   // заполнить список файлов
   getFileNameList("C:\\windows\\*", &fileList);

   //
   // вывод на экран
   //

   // по простому
   for(int i=0; i<fileList.size(); i++)
   {
      printf("%s\r\n", fileList[i].c_str());
   }

   // по выпендрежному
   std::for_each(fileList.begin(), fileList.end(), print_string);

   return 0;
}
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Отправить e-mail  
BS
Эксперт
СообщениеДобавлено: Чт 19-07-07 : 07-31    Заголовок сообщения: Ответить с цитатой

Это конечно красиво, но я не силён в этом пока. Иначе бы не спрашивал.
perf писал(а):
второй пример смотрел невнимательно

Точно) Заметил теперь...
ещё раз спасибо
[/list]
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
perf
Продвинутый форумчанин
СообщениеДобавлено: Чт 19-07-07 : 22-36    Заголовок сообщения: Ответить с цитатой

BS писал(а):
Это конечно красиво, но я не силён в этом пока. Иначе бы не спрашивал.

показываю к чему нужно идти.
твой код - на С, а не на С++.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Отправить e-mail  
BS
Эксперт
СообщениеДобавлено: Пт 20-07-07 : 18-01    Заголовок сообщения: Ответить с цитатой

perf, Respect
не всё сразу...
Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
Страница 1 из 1

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы