Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++.Проблема с выводом дерева каталогов

48K
19 декабря 2009 года
Akord
20 / / 06.12.2009
Как сделать, чтобы прога, представленная ниже, выводила не только имена каталогов, но и файлов(в том числе скрытых), что там есть?

Код:
#define IDENT '-'
#define IDENT_SIZE 1
 
using namespace std;
 
void printId(int n)
{
  for(int i = 0; i < n * IDENT_SIZE; i++)
  {
    cout<<IDENT;
  }
}
 
void listDir(char *dirName, int lev)
{
  HANDLE h;
  WIN32_FIND_DATA info;
  char fullPath[MAX_PATH] = { '\0' };
  strcpy(fullPath, dirName);
  strcat(fullPath, "*.*");
  if ((h = FindFirstFile(fullPath, &info)) != INVALID_HANDLE_VALUE)
  {
    do
    {
      if (!(strcmp(info.cFileName, ".") == 0 || strcmp(info.cFileName, "..") == 0))
      {
        if(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
          printId(lev);
          cout<<info.cFileName<<endl;
          strcpy(fullPath, dirName);
          strcat(fullPath, info.cFileName);
          strcat(fullPath, "\\");
          listDir(fullPath, level + 1);
        }
      }
    }while(FindNextFile(h, &info));
    FindClose(h);
  }
}
 
void main()
{
  char dir[MAX_PATH] = { нужный каталог};
  listDir(dir, 0);
  getchar();
}
7
19 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
Как-как?Не смотреть,выставлен ли FILE_ATTRIBUTE_DIRECTORY,а выводить всё подряд.Т.е. убрать проверку и ничего лишнего:)
Ну ещё для на всякий случай можно искать не по маске "*.*",а просто "*"(хотя вполне возможно,что "*.*" прокатит.Ну этот эксперимент я оставляю на ваше усмотрение)
И кстати,вроде в Си(или в API) есть специальная функция,чтобы выводить нужное количество символов(во!Минута поиска сразу дала результат)

Upd:хотя нет,проверку на папочность всё же надо оставить–вы ж в них потом ищете.Значит,если это была не папка(т.е. в else) выводите имя файла
48K
20 декабря 2009 года
Akord
20 / / 06.12.2009
угу, спасибо, разобрался.
а как сделать чтоб скрытые файлы выводились?
7
20 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
В смысле выводились?Разве они не ищутся FindFirstFile/FindNextFile?
Если так,то пользоваться FindFirstFileEx/FindNextFileEx
41K
20 декабря 2009 года
Alex57
44 / / 22.02.2009
Цитата: Akord
угу, спасибо, разобрался.
а как сделать чтоб скрытые файлы выводились?



Подобная тема http://forum.codenet.ru/showthread.php?t=57999 Используются функции _findfirst() и _findnext() ( #include <io.h> ).
Информация о скрытых файлах тоже выводится.

 
Код:
FILE NAME                                          SIZE

 N:\
Копия boot.ini                                     214
pagefile.sys                                       268435456
Bootfont.bin                                       4952
ntldr                                              250624
NTDETECT.COM                                       47564
boot.ini                                           404


http://msdn.microsoft.com/en-us/library/aa246869(VS.60).aspx

_findfirst

Provides information about the first instance of a filename that matches the file specified in the filespec argument.
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
48K
20 декабря 2009 года
Akord
20 / / 06.12.2009
сорри, я неграмотно сформулировал вопрос. Точнее, совсем неверно)

у меня потом будет задаваться параметр ч\з командную строку, в зависимости от которого будут выводиться или все файлы или только те, что не имеют атрибута "скрытый". Как отделить "нормальные" файлы от скрытых?
41K
20 декабря 2009 года
Alex57
44 / / 22.02.2009
Цитата: Akord
Как отделить "нормальные" файлы от скрытых?



Скрытый файл или нет, проверяем с помощью

 
Код:
if ( info.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)


См. также по поводу WIN32_FIND_DATA Structure
http://msdn.microsoft.com/en-us/library/aa365740(VS.85).aspx

В функцию main() добавим код

 
Код:
bool bPrintHidden=false;

    // если в командной строке указано   /h
    // то скрытые файлы тоже печатаем
    for ( int i=0; i<argc; i++)
    {
        if ( strcmp( argv, "/h") == 0 )   bPrintHidden=true;
    }


Внутри цикла проверяем, печатать или нет.

 
Код:
// при печати проверяем
    if( !( info.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) || bPrintHidden )
    {
        //     выводим имя файла        
    }
48K
20 декабря 2009 года
Akord
20 / / 06.12.2009
спасибо!
все работает, все понимаю)
48K
04 января 2010 года
Akord
20 / / 06.12.2009
скажите пожалуйста, а как преобразовать этот код в чистый с++?
Мне нужно использовать STL, а я не могу понять, с какого боку подступиться...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог