powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / папка это файл?
25 сообщений из 230, страница 9 из 10
папка это файл?
    #39997680
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

в общем накатил я это все в убунту, сделав папку 123
сишный файл a1.c прилагаю.
делаю:
gcc -o myprog a1.c
./myprog 123

вывод :
read bytes=-1
read bytes=-1

Этот вывод я поставил в readdir (см. исходник) таким образом все работает пока не доходит до readdir. при этом opendir отрабатывает. похоже тут все же не отрабатывает read для каталога . Получается , что в линухе все ж файловая система отлична от юниксовой.
Код: plaintext
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.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 14
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef DIRSIZE
#define DIRSIZE 14
#endif // !DIRSIZE


typedef struct {
    long ino;
    char name[NAME_MAX + 1];
} Dirent;

typedef struct {
    int fd;
    Dirent d;
} DIR;

DIR* opendir(const char* dirname);
Dirent* readdir(DIR* dfd);
void closedir(DIR* dfd);




void fsize(const char* name);


void dirwalk(const char*, void (*fcn)(const char*));

void fsize(const char* name)
{

    struct stat stbuf;
    if (stat(name, &stbuf) == -1) {
        fprintf(stderr, "fsize: can't access %s\n", name);
        //printf(stderr, "fsize: can't access %s\n", name);
        return;
    }
    /*
    printf("S_IFMT = 0%o\n" ,S_IFMT ) ;
    printf("S_IFDIR = 0%o\n",S_IFDIR) ;
    printf("S_IFCHR = 0%o\n",S_IFCHR) ;
    printf("S_IFBLK = 0%o\n",S_IFBLK) ;
    printf("S_IFREG = 0%o\n",S_IFREG) ;
    
    printf("stbuf.st_mode & S_IFMT = 0%o\n", stbuf.st_mode & S_IFMT);
    */
    
    if ((stbuf.st_mode & S_IFMT) == S_IFDIR) {
    
    dirwalk(name, fsize); }
    //printf("ggg%8ld %s\n", stbuf.st_size, name);

}

#define MAX_PATH 1024

void dirwalk(const char* dir, void (*fcn)(const char*))
{
    char name[MAX_PATH];
    Dirent* dp;
    DIR* dfd;
    if ((dfd = opendir(dir)) == NULL) {
        fprintf(stderr, "dirwalk: can't open %s\n", dir);
              return;
    }
    //printf("%s\n", dir );
     while ((dp = readdir(dfd)) != NULL) {
      
          if (strcmp(dp->name, ".") == 0 || strcmp(dp->name, "..") == 0) continue;
          if (strlen(dir) + strlen(dp->name) + 2 > sizeof(name))
              fprintf(stderr, "dirwalk: name %s %s too long\n", dir, dp->name);
              //printf(stderr, "dirwalk: name %s %s too long\n", dir, dp->name);
          else {
              sprintf(name, "%s/%s", dir, dp->name);
              (*fcn)(name);
          }
      }
      closedir(dfd);
}

struct direct
{
    ino_t d_ino;
    char d_name[DIRSIZE];
};



DIR* opendir(const char* dirname)
{
    int fd;
    struct stat stbuf;
    DIR* dp;
        if ((fd = open(dirname, O_RDONLY, 0)) == -1
            || fstat(fd, &stbuf) == -1
            || (stbuf.st_mode & S_IFMT) != S_IFDIR
            || (dp = (DIR*)malloc(sizeof(DIR))) == NULL) 
                        return NULL;
        dp->fd = fd;
      
        return dp;
}

Dirent * readdir(DIR* dp)
{
    struct direct dirbuf;
    static Dirent d;
          char test[50];
    int y=read(dp->fd, test, sizeof(dirbuf)) ;
     printf("read bytes=%d \n",y);
     int x=read(dp->fd, (char*)&dirbuf, sizeof(dirbuf));
     printf("read bytes=%d \n",x);          
    while (read(dp->fd, (char*)&dirbuf, sizeof(dirbuf)) == sizeof(dirbuf))
    {

        if (dirbuf.d_ino == 0) continue;
        d.ino = dirbuf.d_ino;
        strncpy(d.name, dirbuf.d_name, DIRSIZE);
        d.name[DIRSIZE] = '\0';
        return &d;
    }
    return NULL;
}
void closedir(DIR* dp)
{
    if (dp) {
        close(dp->fd);
        free(dp);
    }
}


int main(int argc, char** argv)
{

      if (argc == 1) fsize(".");
      else
      { 
          while (--argc > 0)
              fsize(*++argv);
    }
    return 0;
}
...
Рейтинг: 0 / 0
папка это файл?
    #39997685
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Получается , что в линухе все ж файловая система отлична от юниксовой.

А ты все ФС проверил ?
...
Рейтинг: 0 / 0
папка это файл?
    #39997686
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

нет
...
Рейтинг: 0 / 0
папка это файл?
    #39997688
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81, классно но вот мне вот это не нравится

Код: plaintext
1.
#define NAME_MAX 14



Почему 14 ? Таких лимитов уже давно нету.
...
Рейтинг: 0 / 0
папка это файл?
    #39997690
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПочему 14 ?

Чтоб сегфолт получить за несоотвествие объявления и реализации.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997691
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

ok поставлю 255.
...
Рейтинг: 0 / 0
папка это файл?
    #39997693
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
mayton,

ok поставлю 255.

Давай почитаем что там. В убунтах в дефолнтной установке под системный раздел ставится ext4.

Что у нее по limitations?

Начну отсюда.
https://en.wikipedia.org/wiki/Ext4
...
Рейтинг: 0 / 0
папка это файл?
    #39997696
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
andron81
mayton,

ok поставлю 255.

Давай почитаем что там. В убунтах в дефолнтной установке под системный раздел ставится ext4.

Что у нее по limitations?

Начну отсюда.
https://en.wikipedia.org/wiki/Ext4


Max. filename length = 255

угадал ?
...
Рейтинг: 0 / 0
папка это файл?
    #39997697
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
mayton
пропущено...

Давай почитаем что там. В убунтах в дефолнтной установке под системный раздел ставится ext4.

Что у нее по limitations?

Начну отсюда.
https://en.wikipedia.org/wiki/Ext4


Max. filename length = 255

угадал ?

Не спеши. Надо понять какие размерности имеются в виду. NTFS декларирует имя узла лимитом в chars.
Тоесть национальные символы уже учтены. А ext4 - байтах. А если - национальные символы?
...
Рейтинг: 0 / 0
папка это файл?
    #39997698
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА ext4 - байтах. А если - национальные символы?

Линуксу пофиг, у него в именах файлов нет символов, только байты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997699
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да но вот Андрон пишет код. И выделяет там chars. Bytes и Chars. Килограммы и фунты. Литры и галлоны.

Не придем мы к одинаковому пониманию.

А по поводу длины Path. В ext4 есть лимит на число вложенностей (примерно 64000). А на длину
путя вообще сняты все ограничения. Так-что вы господа если хотите с гарантией хранить путь
в этой файловой системе - то озадачтесь таким буфером чтоб на все хватило.
...
Рейтинг: 0 / 0
папка это файл?
    #39997700
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

А почему ж есть ограничение вложенности?
...
Рейтинг: 0 / 0
папка это файл?
    #39997701
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А пес его знает.
...
Рейтинг: 0 / 0
папка это файл?
    #39997705
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Не спеши. Надо понять какие размерности имеются в виду. NTFS декларирует имя узла лимитом в chars.
Тоесть национальные символы уже учтены. А ext4 - байтах. А если - национальные символы?


ntfs какое отношение имеет ?
...
Рейтинг: 0 / 0
папка это файл?
    #39997706
petrav
А почему ж есть ограничение вложенности?

64000 - это как бы и не ограничение вовсе...
где их столько набрать
...
Рейтинг: 0 / 0
папка это файл?
    #39997709
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
техническое ИМХО. Надож было что-то написать. Не бесконечность же ставить.
Хотя вот в ext3 было в два раза меньше. Значит что-то специально изменяли.
...
Рейтинг: 0 / 0
папка это файл?
    #39997710
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
техническое ИМХО. Надож было что-то написать. Не бесконечность же ставить.
Хотя вот в ext3 было в два раза меньше. Значит что-то специально изменяли.

Техническое было бы 2 32 или 2 64 . Это если для работы зачем-то нужно знать текущий уровень вложенности.
...
Рейтинг: 0 / 0
папка это файл?
    #39997737
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
mayton,

ok поставлю 255.

В линуксе нет UFS. Прочитай ещё раз внимательно мой предыдущий комментарий.
...
Рейтинг: 0 / 0
папка это файл?
    #39997743
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Это все не очень важно. Если у меня проблема, что папка не читается как файл: read возвращает (- 1) .
...
Рейтинг: 0 / 0
папка это файл?
    #39997747
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
mayton,

Это все не очень важно. Если у меня проблема, что папка не читается как файл: read возвращает - 1.

Мы потом твою утилиту протестируем. Посчитаем на толстом диске все файлы.

Кстати где ты плюсуешь размер?

И кстати ты различаешь 2 типа сущностей. Все что является S_ISDIR и все остальное.
Но вот все остальные типы (классы) файлов не всегда являются файлами.
И если вести суммарный подсчет их занимаемого места - то наверное надо
подходить индивидуально. Например как считать сим-линк? Плюсовать его место или нет?

Да много там чего. Вобщем не такое простое это дело. Кстати логический
размер файла в Linux может превышать размер доступного места в файловой системе.

И это безо всяких техник архивации. Это - штатная возможность.
...
Рейтинг: 0 / 0
папка это файл?
    #39997771
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81Если у меня проблема, что папка не читается как файл: read возвращает (- 1) .

Она и не должна читаться. Кто тебе сказал обратное?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997776
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81Если у меня проблема, что папка не читается как файл: read возвращает (- 1) .

Она и не должна читаться. Кто тебе сказал обратное?


K&r вот кто
...
Рейтинг: 0 / 0
папка это файл?
    #39997787
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81K&r вот кто

Не верю! (с)

Походу, ты сделал несколько опечаток, когда вместо fstat напечатал read...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997805
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81K&r вот кто

Не верю! (с)

Походу, ты сделал несколько опечаток, когда вместо fstat напечатал read...


это ж в каком состоянии надо быть чтобы так опечататься ?
...
Рейтинг: 0 / 0
папка это файл?
    #39997822
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81это ж в каком состоянии надо быть чтобы так опечататься ?

Да, в общем-то, в типичном для тех времён. "На весь мир требуется не более полудюжины
компьютеров."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 230, страница 9 из 10
Форумы / C++ [игнор отключен] [закрыт для гостей] / папка это файл?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]