С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 12
1

С на Unix. Посчитать размер файлов в текущем поддереве

20.05.2015, 22:27. Показов 3022. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//Подключаем необходимые библиотеки
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
 
int dcheck(char *dname)
{
    struct stat stbuf;      //Атрибуты элемента
    struct dirent *entry;       //Элемент каталога
    DIR *d;             //Дескриптор дериктории
    //Переменная, содержащая путь к проверяемым файлам и папкам
    char *cur_ent = malloc(sizeof(char)); 
    int count = 0;
    //Получаем дескриптор, переданной в функцию, директории
    if ((d = opendir(dname)) != NULL)
    {
        //Получаем по очереди все элементы директории и проверяем их
        while((entry = readdir(d)) != NULL)
        {
    //Если попалась запись начинающиеся на . или .. пропускаем ее
            if(!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
                continue;
    //Копируем в переменную cur_ent название директории
            strcpy(cur_ent, dname);
    //Вставляем символ разделителя директории
            strcat(cur_ent,"/");
    //Добавляем имя элемента
            strcat(cur_ent, entry->d_name);
    // Получаем атрибуты текущей записи
            stat(cur_ent, &stbuf);
    //Проверяем является ли текущая запись папкой
            if(!((stbuf.st_mode & S_IFMT) == S_IFDIR))
            {
             count+= stbuf.st_size;
            }
        }
   //Иначе закрываем дескриптор и возвращаем значение 0
        closedir(d);
    }
    return count;
}
 
int main(void)
{
    int count = 0;
    DIR *d;
    struct dirent *entry;
    struct stat stbuf;
    // Получаем дескриптор текущей директории
    d = opendir("."); 
    //Получаем по очереди все элементы директории и проверяем их
    while ((entry = readdir(d)) != NULL)
    {
        //Если попалась запись начинающиеся на . или .. пропускаем ее
        if(!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
            continue;
        // Получаем атрибуты текущей записи
        stat(entry->d_name, &stbuf);
        if((stbuf.st_mode & S_IFMT) == S_IFDIR)
        {
            //Если да, то передаем имя этой директории в функцию dcheck
            count+=dcheck(entry->d_name);
        }
        //Проверяем является ли текущая запись папкой
        if(!((stbuf.st_mode & S_IFMT) == S_IFDIR))
        {
         count+= stbuf.st_size;
        }     
    }
     // Закрываем дескриптор
    closedir(d);
    printf("%d\n", count);
    return 0;
}
Помогите найти ошибку. Не пойму в чём дело. Сама задача стоит такая: нужно посчитать размер файлов в текущем поддереве. Она считает размер файлов, но когда я начинаю проверять (сам на калькуляторе всё пересчитываю) у меня получаются другие результаты. Пол дня на ней потратил, не могу понять где ошибся. Программу пишу под Unix.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2015, 22:27
Ответы с готовыми решениями:

Подсчитать число блоков, занятых в текущем поддереве под следующие файлы: *.*, *.с, *.txt
Здравствуйте, помогите, пожалуйста, с задачей. Не знаю с чего начать. Дали методичку по данной...

Поиск в поддереве текстовых файлов (Shell)
Помогите пожалуйста, не могу разобраться! С помощью одной составной команды shell выполнить...

Вывести номера вершин, у которых количество потомков в левом поддереве не равно количеству потомков в правом поддереве
Помогите Граф отобразить, путь вывести. Если нет пути, вывести сообщение. Ввод матрицы должен...

Поиск в поддереве файлов, содержащих совокупность символов
помогите пожалуйста!! с помощью одной составной команды shell выполнить действия: Поиск в вашем...

4
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
20.05.2015, 22:37 2
Цитата Сообщение от Анкуд Посмотреть сообщение
нужно посчитать размер файлов в текущем поддереве
хм, а чем вас не устроило 'du -s .' ?

Не по теме:

программирование под (л)юникс тем и отличается, что в 99,9% случаев достаточно просто ввести нужную команду из терминала

0
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 12
20.05.2015, 22:40  [ТС] 3
У меня задание сделать это именно на С, команды Unix-а нельзя использовать
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
20.05.2015, 23:03 4
по коду:
1.
C
1
char *cur_ent = malloc(sizeof(char));
зачем вам выделять один байт в куче?
2.
C
1
strcpy(cur_ent, dname);
подозреваю, возникнет segfault, ну или, если повезет, то undefined behaviour. вы выделили один байт, и пытаетесь в него впихнуть кучу байтов, strcat-ы и иже с ними -- туда же.
3.
C
1
2
3
4
if(!((stbuf.st_mode & S_IFMT) == S_IFDIR))
* * * * * * {
* * * * * * *count+= stbuf.st_size;
* * * * * * }
так я не понял, вы считаете просто сумму файлов во вложенных директориях? то есть вам неинтересно, сколько будут занимать файлы внутри директорий внутри этих директорий?
по идее, ваша программа, если она не крешится, то должна показывать сумму размеров файлов в текущей и вложенной в нее директориях, не переходя уровнями ниже. проверьте, на калькуляторе, так ли это

Добавлено через 2 минуты

Не по теме:

а, ну и еще, для конструкций вида !(a == b) есть оператор a != b. с его помощью код получается немного понятнее:)



Добавлено через 12 минут
4.
C
1
2
3
//Если попалась запись начинающиеся на . или .. пропускаем ее
            if(!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
                continue;
этот комментарий неверен. имя записи не просто начинается, а является либо точкой либо двумя точками. на файлах вроде ".local" это условие будет равно false
0
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 12
20.05.2015, 23:05  [ТС] 5
Я обычно на С++ пишу, через new выделяю память, а тут задание на С, запутался как правильно здесь память выделять.
а на
Цитата Сообщение от NEbO Посмотреть сообщение
по идее, ваша программа, если она не крешится, то должна показывать сумму размеров файлов в текущей и вложенной в нее директориях, не переходя уровнями ниже.
да, она это и делает, но считает не правильно. уже думаю может я чего-то не правильно проверяю на калькуляторе, позвал одногруппника глянуть, но нет. Постоянно показывает размер больше, чем есть на самом деле. Не понимаю почему. На самом деле прога должна считать полную вложенность, но я на этом уже застрял и не могу продвинуться.
0
20.05.2015, 23:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2015, 23:05
Помогаю со студенческими работами здесь

Отслеживание удаления файлов/каталогов в поддереве указанного каталога
Помогите написать программу по заданию которое указано в теме. В линуксе вообще не понимаю, в...

Отслеживание изменений размеров файлов в поддереве указанного каталога
Нужно сделать прогу по заданию, которое указано в теме Собстсвенно, нашёл код Помогите разобрать,...

Выполнить поиск в заданном поддереве файловой структуры всех файлов
Вот задачка: 1) Как должен выглядеть главный скрипт? Т.е как организовать: &quot;вывод на экран...

Посчитать количество и суммарный размер файлов, находящихся в каталоге /etc и имеющих второй буквой в названии "а"
Помогите написать скрипт в баше. посчитать количество файлов и суммарный размер файлов которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru