Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: список файлов  (Прочитано 16062 раз)
0 Пользователей и 1 Гость смотрят эту тему.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« : 23-02-2008 13:23 » 

нужно сделать некий объект, который может выводить список файлов с их относительными путями, т.е. например дали на вход директорию /var нужно пройтись по всем вложеным каталогам вывести список файлов и их пути. Подскажите куда рыть?

Пока что я могу выводить только список каталогов в пределах одного каталога, т.е. например на вход дали каталог /var в результате получил вот это:

Каталог-log
Каталог-.
Каталог-spool
Каталог-mail
Каталог-cache
Каталог-games
Каталог-crash
Каталог-..
Каталог-local
Каталог-backups
Каталог-lib
Каталог-tmp
Каталог-opt
Каталог-lock
Каталог-run


вот код программы

Код:
#include <stdio.h>
#include <dirent.h> //for scan dir
#include <stdlib.h>
#include <memory.h>
#include <sys/stat.h>

int ListFile();

int main()
{
    ListFile();
}

int ListFile()
{
    DIR *dirr;
    char *in_dir="/var";
    struct dirent *entry;
    char list[100][100]={0};
    dirr=opendir(in_dir);

    if(dirr==NULL)
    {
     printf("Error read directory");
     return 0;
    }

    while(entry=readdir(dirr))
    {
     int i=0;
     strcpy(list[i],entry->d_name);

     printf("Каталог-%s\n",list[i]);
     i++;
    }

    closedir(dirr);
    return 0;
}
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 23-02-2008 13:37 » 

Вот когда то баловался
Код:
     #include <stdio.h>
     #include <dirent.h>
     #include <unistd.h>
     #include <sys/stat.h>
     #include <stdlib.h>
     
     static int one (const struct dirent64 *dir)
     {
       if ((dir->d_name[0] == '.') && (dir->d_name[1] == 0)) return 0;
       if ((dir->d_name[0] == '.') && (dir->d_name[1] == '.')&& (dir->d_name[2] == 0)) return 0;
       return 1;
     }
     
     static long int scan(char *ch,int level=0)
     {
         long int res=0;
         if (ch !=NULL)
         {
            if (chdir(ch) !=0) return res;
            struct dirent64 **eps;
            struct stat64 st;
            int n;
     
            n = scandir64 ("./", &eps, one, alphasort64);
            if (n >= 0)
            {
                int cnt;
                for (cnt = 0; cnt < n; ++cnt)
                {
                   int i=0;
                   while (i<(level-1))
                   {
                      printf(" | ");
                      i++;
                   }
                   if (level != 0)printf(" |-");

                   if (eps[cnt]->d_type == DT_DIR)
                   {
                      printf("%-30s\n",eps[cnt]->d_name);
                      long int size=scan(eps[cnt]->d_name, level+1);
                      res+=size;
                         
                   }
                   if (eps[cnt]->d_type==DT_REG)
                   {
                      if (stat64(eps[cnt]->d_name, &st) == 0) res+=(long int)st.st_size;
                      printf("%-30s   %ld\n",eps[cnt]->d_name, (long int)st.st_size);   

                   }
                }
                for (cnt = 0; cnt < n; ++cnt) free(eps[cnt]);
                free(eps);
            }
            else
                  perror ("Couldn't open the directory");
            chdir("..");
         }
         return res;
     }
     
     int main (void)
     {
        printf("%ld\n",scan("/home"));
       return 0;
     }
Вся работа строится на функции scandir.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 23-02-2008 17:13 » 

McZim, это уже не С, но все равно стоит знать: есть такая команда find - она все ищет, что только не попросишь.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 23-02-2008 18:05 » 

RXL, ээээ, а при чем тут find? мне же нужен класс а не просто что то найти Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 23-02-2008 18:07 » 

McZim, так никто не запрещает вызвать find и читать готовый результат из потока. Это ведь тоже решение.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 23-02-2008 20:31 » 

RXL, хм, да возможно, но зачем?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 23-02-2008 21:36 » 

McZim, иногда это быстрее и дешевле, чем писать свое. Написать рекурсивный обход каталогов не сложно, но если нужно срочно и с не уточненными условиями, то и внешнюю команду вызвать не зазорно. Ведь в оболочке с командами проще экспериментировать, чем с исходниками С.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #7 : 23-02-2008 21:37 » 

RXL, да тут дело скорее не в скорости написания, а в том что бы я учился!
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 23-02-2008 21:46 » 

Учись  Флаг тебе в руки!

pinfo libc
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 24-02-2008 17:42 » 

McZim, попробуй boost::filesystem там есть готовые классы
http://www.boost.org/libs/filesystem/example/simple_ls.cpp

а вообще задача тривиальна до безобразия.
http://www.opennet.ru/docs/RUS/glibc/glibc-9.html#ss9.2
прочитать каталог, пройтись по всем записям каталога, если наткнулись на каталог, то зайти туда рекурсивно

Записан

Странно всё это....
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #10 : 24-02-2008 17:49 » new

LogRus, не хочу использовать готовое. Да задача тривиальная, но отсутвует опыт программирования.

вот что вырисовывается, только еще нужна доработка ессно Улыбаюсь

Код:
int F_ScanDir(char *Path);

int main()
{
    char Path[]="/var";
    F_ScanDir(Path);
}
//**************************************************************************************

int F_ScanDir(char *Path)
{
    DIR *listdir;
    struct dirent *entry;
    listdir=opendir(Path);
 
    while(entry=readdir(listdir))
    {
        if(entry->d_type==DT_DIR)
        {
            char NewPath[1024];
            strcpy(NewPath,Path);
            strcat(NewPath,"/");
            strcat(NewPath,entry->d_name);
           
            if (strcmp(entry->d_name,".") && strcmp(entry->d_name,".."))
             F_ScanDir(NewPath);
            else
             return 0;
        }

        if(entry->d_type==DT_REG)
         printf("Файл-%s\n",entry->d_name);
    }

    closedir(listdir);
}
//***********************************************************************************

Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines