| 
			| 
					
						| 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. |  |  | 
	|  |