Статьи Галерея Форум Чат Файлы HowTo Ссылки Поиск
Текущее время: 18 окт 2019, 15:55




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: readdir & lstat
СообщениеДобавлено: 02 май 2003, 03:34 
nado oboiti vse katalogi.
problema v tom, chto lstat nehochet prinimat' v kachsteve pervogo parametra znachenie iz stucturi, obyavlennoi dlya readdir.
help!



ps: mojet u kogo est' ftw.h?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 02 май 2003, 13:26 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 30.08.2002
Сообщения: 2339
Откуда: Minsk
в голову приходит простой, грязный, но рабочий хак
Код:
popen("find . -type d -print", "r");

сорри, нет времени проверить поведение readdir, lstat

_________________
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 03 май 2003, 02:31 
[uNIx]mend0za писал(а):
в голову приходит простой, грязный, но рабочий хак
Код:
popen("find . -type d -print", "r");

сорри, нет времени проверить поведение readdir, lstat


hm... neplohoi variant, no predpochtitel'nee sdet' cherez lstat.

vot prototipi:

#include <sys/types.h>
#include <sys/stat.h>

int stat(const char *path, struct stat *sb);
int lstat(const char *path, struct stat *sb);

struct stat {
dev_t st_dev; /* inode's device */
ino_t st_ino; /* inode's number */
mode_t st_mode; /* inode protection mode */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of the file's owner */
gid_t st_gid; /* group ID of the file's group */
dev_t st_rdev; /* device type */
..
}



#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *filename);
struct dirent *readdir(DIR *dirp);

struct dirent {
__uint32_t d_fileno; /* file number of entry */
__uint16_t d_reclen; /* length of this record */
__uint8_t d_type; /* file type, see below */
__uint8_t d_namlen; /* length of string in d_name */

#ifdef _POSIX_SOURCE
char d_name[255 + 1]; /* name must be no longer than
this */
#else
#define MAXNAMLEN 255
char d_name[MAXNAMLEN + 1]; /* name must be no longer than
this */
#endif
};


vot kak ya delau:


struct dirent *readdir (DIR *dirptr);
void rewinddir (DIR *dirptr);
int fileDir(char *);

int double_ls_dir(const char *name)
{
struct dirent *d;
int i;

DIR *dp;
if ((dp = opendir(name)) == NULL) return(1);
while (d = readdir(dp))
{
if (strcmp(d->d_name, "file.txt") == 0) //
{
printf("%s\n", name);
exit(1);
}

if ((i = fileDir(d->d_name)) == 1)
{
printf("--- DIR ---\n");
}
else
if (i == 2)
{
printf("--- FILE ---\n");
}

}
closedir(dp);
return(0);
}

int fileDir(char *name)
{
struct stat info;
extern int errno;
int err;
char *s;
if ((err = lstat(name, &info)) == -1)
{
printf("error: %s\n",strerror(errno));
exit(1);
};

if (S_ISDIR(info.st_mode))
{
return (1);
//chdir(d->d_name); //rekursivnii obhod
//double_ls_dir(d->d_name);
}
else
{
return (0);
}

}

struct dirent *readdir (DIR *dirptr);
void rewinddir (DIR *dirptr);
int fileDir(char *);


// ???????? ??????????? ????????

int double_ls_dir(const char *name)
{
struct dirent *d;
int i;

DIR *dp;
if ((dp = opendir(name)) == NULL) return(1);
while (d = readdir(dp))
{
if (strcmp(d->d_name, "file.txt") == 0) // ?????? ???? ?????
????? ?? ???? "file.txt"
{
printf("%s\n", name);
exit(1);
}


// ??? ???????????? ?????? ???? ????????? ?????????? ?????????? ????????
?? ???? ?????????
// ? ????????? fileDir ?????????? ??? ????? d->d_name ? ???????????? 1
???? ??????? ? 0 ???? ?? ???????

if ((i = fileDir(d->d_name)) == 1)
{
printf("--- DIR ---\n");
}
else
if (i == 2)
{
printf("--- FILE ---\n");
}

}
closedir(dp);
return(0);
}


int main (void)
{
char path[100];
int i;

double_ls_dir("/");

return(0);
}

int fileDir(char *name)
{
struct stat info;
extern int errno;
int err;
char *s;

if ((err = lstat(name, &info)) == -1)
{
printf("error: %s\n",strerror(errno));
exit(1);
};

if (S_ISDIR(info.st_mode))
{
return (1);

//chdir(d->d_name);
//double_ls_dir(d->d_name);

}
else
{
return (0);
}

}


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 08 май 2003, 03:29 
Replace following your code
Код:
int double_ls_dir(const char *name)
{

    ........ /* skipped by awn */

    while (d = readdir(dp))
    {
        if (strcmp(d->d_name, "file.txt") == 0)  //
        {
            printf("%s\n", name);
            exit(1);
        }

       if ((i = fileDir(d->d_name)) == 1)
       {
           printf("--- DIR ---\n");
       }

    ........ /* skipped by awn */
    }

    closedir(dp);
    return(0);
}


by something like

Код:
int double_ls_dir(const char *name)
{

    ........ /* skipped by awn */

    while (d = readdir(dp))
    {
        size_t fullname_buff_len = strlen(name)+strlen(d->d_name)+2;
        char* fullname = malloc(fullname_buff_len);
        assert(fullname);
        snprintf(fullname, fullname_buff_len, "%s/%s", name, d->d_name);

        if (strcmp(fullname, "file.txt") == 0)  //
        {
            printf("%s\n", fullname);
            free(fullname);
            exit(1);
        }

       if ((i = fileDir(fullname)) == 1)
       {
           printf("--- DIR ---\n");
       }

        ........ /* skipped by awn */

        free(fullname);
    }

    closedir(dp);
    return(0);
}



Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
[ All resources are available under GNU GPL ] [ Support ] [ Hosted by DataHata | MyCloud.by ] [ Powered by phpBB® Forum Software © phpBB Group ]

LVEE Winter LVEE Rambler's Top100