Tonal |
Дата 2.7.2010, 8:40 |
|
А чё тут думать?
# find ~ -size 100M
|
eu8cc |
Дата 7.6.2010, 8:23 |
|
а если так организовать?
void find(char const *dirname,int minsize,int maxsize,FILE *out); { DIR *dr=opendir (const char *dirname); if (dr==NULL) { fprintf(stderr,"Невозможно открыть директорию \"%s\"",dirname); fclose(out); errno = ENOENT; perror(", "); return -1; exit(1); } struct dirent *dt; while((dt=readdir(dr))) { if(dt->d_type=DT_DIR) find; if(dt->d_type=DT_REG) { if(((dt->st_size)>minsize) $$ ((dt->st_size)<maxsize))) { fprintf(out,"%-40s %-10jd %s\n",filename, (intmax_t) dt->st_size); i=i+1; } } } return 0; } int main (int argc,char* argv[]) { if (argc != 5) { fprintf(stderr,"Не все параметры заданы\n"); errno = EINVAL; //invalid arguments perror(argv[0]); printf("формат: нач_размер кон_размер папка имя_файла\n"); return -1; } out = fopen (argv[4],"w+"); if ( out == NULL) { printf("NULL\n"); fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]); perror(", "); return -1; } DIR *dr = opendir(argv[3]); if (dr == NULL) { fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[3]); fclose(out); errno = ENOENT;// no such file or directory perror(", "); return -1; } minsize = atol(argv[1]); maxsize = atol(argv[2]); dirname = argv[3] find(*dirname,minsize, maxsize, FILE *out); printf ("Число просмотренных файлов равно %d\n", i); closedir(dr); fclose(out); return 0; }
|
alex977 |
Дата 1.6.2010, 9:26 |
|
Iron Bug, я к тому, что это универсальная ф-ция. Что перебирать - определяет пользователь, устанавливая нужные флаги.
eu8cc, у тебя в принципе все уже есть. Нужно только проверить работу программы на реальном каталоге. По результатам - вносить изменения. |
eu8cc |
Дата 1.6.2010, 8:50 |
|
я тоже думаю что не нужны линки
Iron Buq, набросайте пожалуйста на ваше усмотрения кода, как Вы считаете она должна быть решаться? Я уже дальше не знаю что делать. А сдать ее уже нужно. |
Iron Bug |
Дата 1.6.2010, 6:46 |
|
я думаю, что тут всё гораздо проще. в задаче ничего не говорится о линках. говорится о файлах. по-моему, это обычная мелкая учебная задача на развитие базовых навыков программирования. а вы её усложняете. хотя, можно и линки туда засандалить без проблем. разницы никакой особой не будет. |
alex977 |
Дата 31.5.2010, 20:58 |
|
Из ранее упоминавшейся книги (буквально предыдущий абзац):
Цитата Чтобы избавиться от проблем, System V предложила функцию ftw () («file tree walk» - обход дерева файлов). ftw() осуществляла всю работу по «прохождению» дерева (иерархии) файлов. Вы предоставляете ей указатель на функцию, и она вызывает эту функцию для каждого объекта файла, с которым сталкивается. Ваша функция должна затем обработать каждый объект файловой системы, как считает нужным.
Какие объекты будут обрабатываться - вложенные каталоги, файлы, символьные ссылки - определяют флаги.
|
eu8cc |
Дата 31.5.2010, 18:17 |
|
Цитата(Litkevich Yuriy @ 31.5.2010, 17:52) дык, а скомпилить и проверить?
не могу у меня линукс стоит, но криво
подправил но согласно начальному условию нужно пройти все вложенные каталоги и подкаталоги, интересно это сможет сделать программка?
#include <dirent.h> #include <errno.h> #include <stdio.h> #include <ftw.h> #include <sys/stat.h> #include <time.h> #include <stdint.h>
size_t s1,s2; //размер файлов в диапазоне s1 <= x <= s2 FILE *f = NULL;
static int tree (const char *filename, const struct stat *status, int flag) if (flag == FTW_F && status->st_size >= s1 && status->st_size <= s2) { fprintf(f,"%-40s %-10jd %s\n",filename, (intmax_t) status->st_size);//пишем в файл } return 0; //возвращаем 0, чтобы продолжить обход дерева,иначе обход прерывается }
int main (int argc,char* argv[]) { if (argc != 5) { fprintf(stderr,"Не все параметры заданы\n"); errno = EINVAL; //invalid arguments perror(argv[0]); printf("формат: нач_размер кон_размер папка имя_файла\n"); return -1; } f = fopen (argv[4],"w+"); if ( f == NULL) { printf("NULL\n"); fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]); perror(", "); return -1; } */ DIR *dr = opendir(argv[3]); if (dr == NULL) { fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[1]); fclose(f); errno = ENOENT;// no such file or directory perror(", "); return -1; } s1 = atol(argv[1]); s2 = atol(argv[2]); nftw(argv[3],tree,0, FTW_DEPTH || FTW_PHYS); //обход дерева closedir(dr); fclose(f); return 0; }
|
Litkevich Yuriy |
Дата 31.5.2010, 17:52 |
|
Цитата(eu8cc @ 31.5.2010, 20:13) по ходу так? дык, а скомпилить и проверить? |
alex977 |
Дата 31.5.2010, 16:36 |
|
Похоже. eu8cc, у меня линукса нет проверить. Только вот
Цитата } */
какой-то мусор (нет начала комментария). Насколько я понял - главное ф-цию tree реализовать правильно.
|
BRE |
Дата 31.5.2010, 16:35 |
|
Цитата(eu8cc @ 31.5.2010, 17:13) по ходу так?
nftw(argv[1],tree,0, FTW_DEPTH || FTW_PHYS); //обход дерева // ~~~~~ Наверное здесь, все таки, argv[3]. Не?
|
Просмотр темы полностью (откроется в новом окне) |
|