URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6506
[ Назад ]

Исходное сообщение
"Определение размеров файлов в каталоге"

Отправлено BigHarry , 30-Май-07 18:46 
Здравствуйте !
Я в Си не силен, поэтому прошу сразу извинить за ламерский вопрос.
Мне нужна програмка на Си, которая бы вывела в консоль имена файлов в каталоге и их размер. Путем долгой медитации с Гуглем и Яндексом родилось у меня следующее уродство:
=======================================================================================
#include <stddef.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>

int
main (void)
{
DIR *dir;
struct stat st;

dir = opendir("/var/log/apache/");

    if (!dir) {
        printf ("Cannot read directory contents\n");
        return 1;
    }

    struct dirent* de;

    while( (de = readdir(dir)) != 0 )
        {

        if (strcmp (de->d_name, ".") == 0 || strcmp (de->d_name, "..") == 0) continue;

        stat(strcat("/var/log/apache/",strrchr(de->d_name,'\0')), &st);
        printf("File: %s Size: %d bytes\n", de->d_name, st.st_size);

    }
    closedir(dir);
    return 0;
}
=======================================================================================
Мое твареньице успешно компилируется, но работать не хочет - система (FreeBSD) сообщает:
Bus error (core dumped)
и на этом все заканчивается.
Вся беда, судя по всему, находится в этой строке:
stat(strcat("/var/log/apache/",strrchr(de->d_name,'\0')), &st);
ибо если ее закоментировать - то программа работает, но, ессно, не дает нужного результата.
Помогите, пожалуйста, победить эту напасть.


Содержание

Сообщения в этом обсуждении
"Определение размеров файлов в каталоге"
Отправлено vic , 30-Май-07 19:17 
>        stat(strcat("/var/log/apache/",strrchr(de->d_name,'\0')), &st);
тут две ошибки
1. делаешь strcat к константной строке.
2. зачем-то вызываешь strrchr да еще с неправильными параметрами

исправляем:
char filename[NAME_MAX + 100]; // по хорошему не так надо, но для этого примера сгодится. strcpy(filename, "/var/log/apache/"); //поместили каталог
strcat(filename, de->d_name); // добавили имя
if (!stat(filename, &st))
  //printf
else
  //error


p.s. Прочти книгу Кернигана и Ричи (она тоненькая) и все станет ясно.


"Определение размеров файлов в каталоге"
Отправлено vic , 30-Май-07 19:18 
упс пример поехал))

char filename[NAME_MAX + 100]; // по хорошему не так надо, но для этого примера сгодится.
strcpy(filename, "/var/log/apache/"); //поместили каталог
strcat(filename, de->d_name); // добавили имя
if (!stat(filename, &st))
  //printf
else
  //error


"Определение размеров файлов в каталоге"
Отправлено A , 31-Май-07 08:28 
>p.s. Прочти книгу Кернигана и Ричи (она тоненькая) и все станет ясно.

А если не сложно, не утоните, какую именно и (в идеале) где продаётся (Москва).



"Определение размеров файлов в каталоге"
Отправлено Romik , 31-Май-07 08:55 
Интересно, как вы не догадались посмотреть исходники команды ls :)

"Определение размеров файлов в каталоге"
Отправлено vic , 31-Май-07 08:59 
>Интересно, как вы не догадались посмотреть исходники команды ls :)

По каждому чиху лезть в исходники тоже не гуд..

Книга: http://www.ozon.ru/context/detail/id/96537/
должна быть в любом магазине где есть нормальный компьютерный отдел.



"Определение размеров файлов в каталоге"
Отправлено BigHarry , 31-Май-07 16:30 
>Интересно, как вы не догадались посмотреть исходники команды ls :)

Да смотрел, вот тока поиском не нашел там ни вызова функции opendir, ни вызова функции stat.



"Определение размеров файлов в каталоге"
Отправлено vic , 31-Май-07 17:34 
>>Интересно, как вы не догадались посмотреть исходники команды ls :)
>
>Да смотрел, вот тока поиском не нашел там ни вызова функции opendir,
>ни вызова функции stat.

Эти функции системные их искать не нужно :) достаточно man opendir и man 2 stat.
Ошибки не связаны с этими функциями, а связаны с непониманием что есть C-строки, как с ними работать, как выделять память, как такие строки копировать, именно поэтому и зашел разговор про книгу авторов языка :)

Удачи.


"Определение размеров файлов в каталоге"
Отправлено BigHarry , 31-Май-07 23:06 
>Эти функции системные их искать не нужно :) достаточно man opendir и
>man 2 stat.
Да в мане написано без примеров и по англицки.
Думал - в исходниках можно будет содрать готовый вариант, да не тут-то было, в гугле и то больше инфы...

"Определение размеров файлов в каталоге"
Отправлено BigHarry , 31-Май-07 16:31 
>тут две ошибки
>1. делаешь strcat к константной строке.
>2. зачем-то вызываешь strrchr да еще с неправильными параметрами

СПАСИБО !!!!