McZim
|
|
« : 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
Спокойный
Администратор
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
|
|
« Ответ #2 : 23-02-2008 17:13 » |
|
McZim, это уже не С, но все равно стоит знать: есть такая команда find - она все ищет, что только не попросишь.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #3 : 23-02-2008 18:05 » |
|
RXL, ээээ, а при чем тут find? мне же нужен класс а не просто что то найти
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
|
|
« Ответ #4 : 23-02-2008 18:07 » |
|
McZim, так никто не запрещает вызвать find и читать готовый результат из потока. Это ведь тоже решение.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #5 : 23-02-2008 20:31 » |
|
RXL, хм, да возможно, но зачем?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
|
|
« Ответ #6 : 23-02-2008 21:36 » |
|
McZim, иногда это быстрее и дешевле, чем писать свое. Написать рекурсивный обход каталогов не сложно, но если нужно срочно и с не уточненными условиями, то и внешнюю команду вызвать не зазорно. Ведь в оболочке с командами проще экспериментировать, чем с исходниками С.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #7 : 23-02-2008 21:37 » |
|
RXL, да тут дело скорее не в скорости написания, а в том что бы я учился!
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
|
|
« Ответ #8 : 23-02-2008 21:46 » |
|
Учись pinfo libc
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|
McZim
|
|
« Ответ #10 : 24-02-2008 17:49 » |
|
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.
|
|
|
|