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

Исходное сообщение
"opendir() && stat()"

Отправлено Jenizix , 21-Июн-05 02:48 
OS: Linux Slackware 10.1
Compiler: g++

Пишу что-то типа ls в *nix... так вот как перебрать содержимое диры я заню, а вот как получить такую информацию о файле как тип файла(бинарник, архив, папка, линк) и т.п. незнаю... и еще, как получить флаги доступа? да и поиск чето не колится...  пока юзаю ф-ию stat()...

Вот что я накодил:
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main( int argc, char* argv[] )
{
    char path[]="/etc";
    char tmp[1024];
    DIR *dir;
    dir = opendir(path);    
    struct dirent *namelist;
    struct stat file_stat;

    while(namelist = readdir(dir))
    {
    if(strcmp(namelist->d_name,"."))
        if(strcmp(namelist->d_name,".."))
        {
            strcpy(tmp,path);
            strcat(tmp,"/");
        strcat(tmp,namelist->d_name);
        stat(tmp,&file_stat);
            printf("%s - %i\n",namelist->d_name, file_stat.st_size);
        }
    }
    
    free(namelist);
    
    return 0;
}


Содержание

Сообщения в этом обсуждении
"opendir() && stat()"
Отправлено SergeyP , 21-Июн-05 16:11 
>OS: Linux Slackware 10.1
>Compiler: g++
>
>Пишу что-то типа ls в *nix... так вот как перебрать содержимое диры
>я заню, а вот как получить такую информацию о файле как
>тип файла(бинарник, архив, папка, линк) и т.п. незнаю... и еще, как
>получить флаги доступа? да и поиск чето не колится...  пока
>юзаю ф-ию stat()...
>
>Вот что я накодил:
>#include <sys/types.h>
>#include <sys/stat.h>
>#include <dirent.h>
>#include <stdio.h>
>#include <malloc.h>
>#include <string.h>
>
>int main( int argc, char* argv[] )
>{
>    char path[]="/etc";
>    char tmp[1024];
>    DIR *dir;
>    dir = opendir(path);
>    struct dirent *namelist;
>    struct stat file_stat;
>
>    while(namelist = readdir(dir))
>    {
>    if(strcmp(namelist->d_name,"."))
>        if(strcmp(namelist->d_name,".."))
>     {
>      strcpy(tmp,path);
>      strcat(tmp,"/");
>        strcat(tmp,namelist->d_name);
>  stat(tmp,&file_stat);
>            printf("%s - %i\n",namelist->d_name, file_stat.st_size);
>     }
>    }
>
>    free(namelist);
>
>    return 0;
>}


Chitai man: man 2 stat , tam vse est':
       struct stat {
                  dev_t         st_dev;      /* device */
                  ino_t         st_ino;      /* inode */
                  mode_t        st_mode;     /* protection */
                  nlink_t       st_nlink;    /* number of hard links */
                  uid_t         st_uid;      /* user ID of owner */
                  gid_t         st_gid;      /* group ID of owner */
                  dev_t         st_rdev;     /* device type (if inode device) */
                  off_t         st_size;     /* total size, in bytes */
                  blksize_t     st_blksize;  /* blocksize for filesystem I/O */
                  blkcnt_t      st_blocks;   /* number of blocks allocated */
                  time_t        st_atime;    /* time of last access */
                  time_t        st_mtime;    /* time of last modification */
                  time_t        st_ctime;    /* time of last change */
              };