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

эта проблема была ещё лет 15 назад
у меня реально линух с/на самбу копирует быстрее, чем линух с/на nfs
и чистая винда тоже быстрее
а чё она решена? NFS 100 лет в обед.

Так может драйвер NTFS под Линукс кривой?
...
Рейтинг: 0 / 0
папка это файл?
    #39997021
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Cerebrum,

FindFirst/FindNextFile

этим я тоже сделаю рекурсивно, но только когда упрусь, в то, что в убунте не выходит как в K&R .


Код: 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.
#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 14
#include <io.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.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(char* dirname);
Dirent* readdir(DIR* dfd);
void closedir(DIR* dfd);




void fsize(const char*);

//int stat(char*, struct stat*);
void dirwalk(char*, void (*fcn)(char*));

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

}

#define MAX_PATH 1024

void dirwalk(char* dir, void (*fcn)(char*))
{
    char name[MAX_PATH];
    Dirent* dp;
    DIR* dfd;
    if ((dfd = opendir(dir)) == NULL) {
        fprintf(stderr, "dirwalk: can't open %s\n", dir);
        return;
    }
      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);
          else {
              sprintf(name, "%s/%s", dir, dp->name);
              (*fcn)(name);
          }
      }
      closedir(dfd);
}

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



DIR* opendir(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;
    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
папка это файл?
    #39997022
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravМожно пояснить почему вы считаете второй подход эффективнее? Он, наверное, был бы
эффективнее если бы FindFirstFile() порождал бы в оперативке список всех файлов данного
каталога.

Наоборот, в этом-то случае он не будет иметь преимуществ. Но я исхожу из того, что каталог
читается по частям с некоторым префетчем. И непосредственной рекурсией мы мало того, что
порождаем тучу одновременно открытых дескрипторов, но и вымываем кэш.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997026
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81DIR* opendir(char* dirname);

Ты зачем это всё объявляешь сам вместо "#include <dirent.h>"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997027
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81DIR* opendir(char* dirname);

Ты зачем это всё объявляешь сам вместо "#include <dirent.h>"?


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

andron81DIR* opendir(char* dirname);

Ты зачем это всё объявляешь сам вместо "#include <dirent.h>"?


в том то и прикол их написать. в K&R и putc описывается и putchar и foef , это же тоже всё описано в stdio.h
правда тут все вышло и проработано мною.
...
Рейтинг: 0 / 0
папка это файл?
    #39997031
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81потому что dirent.h я не включил и не в курсе о его существовании

Требуемый заголовочный файл явно называется в начале (у man) или конце (у MSDN) страницы с
описанием функции. Если ты не в курсе его существования, значит ты даже не пытался найти и
прочитать документацию по используемым функциям. В морг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997032
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

не пытался. я строго по книге. и до сих пор все удавалось пока не уперся в UNIX концепцию.
история такова , что эти функции описываются. какая нафиг документация и dirent.h
вы сырцы смотрите из книги K&R !
...
Рейтинг: 0 / 0
папка это файл?
    #39997035
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

цель то не получить результат любой ценой , а понять реализацию этих функций из dirent.h .
а для этого сырцы должны работать , а в этом проблема , они заточены только под Юникс.
А функции, да оказывается описаны. наверно и под винды адаптированы.
...
Рейтинг: 0 / 0
папка это файл?
    #39997040
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81, по этой теме не поймем мы тебя, как и ты нас. Ты считаешь истиной книгу 40-летней давности, когда всей индустрии всего лет 60 с небольшим.
Ты полностью согласен со своими взглядами в 15 лет? Ну вот и тут также, есть ошибки молодости, их давно исправили, но эту книгу никто переписывать не стал. Считаешь что должен что-то сделать по этому поводу - просто возьми и сделай.
...
Рейтинг: 0 / 0
папка это файл?
    #39997046
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

ты упёрся не UNIX концепцию а в Linux концепцию.
Чтение директории в линуксе выполняется через системный вызов. getdents Ну или через API оборачивающий системные вызовы.
...
Рейтинг: 0 / 0
папка это файл?
    #39997052
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько code-review points.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void dirwalk(char* dir, void (*fcn)(char*))
{
    char name[MAX_PATH];
    Dirent* dp;
    DIR* dfd;
    if ((dfd = opendir(dir)) == NULL) {
        fprintf(stderr, "dirwalk: can't open %s\n", dir);
        return;
    }
      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);
          else {
              sprintf(name, "%s/%s", dir, dp->name);
              (*fcn)(name);
          }
      }
      closedir(dfd);
}



Функции подобные strlen, strcmp имеют линейный расчет сложности. Тоесть чем длиннее строка тем они дольше
делают перемотку вперед. 2х гигабайтная строка будет считаться несколько секунд. Примерно как memory тест
при старте старых комьютеров. Когда черный экран Биоса нам освящает загрузку.

Особенность сишных строк чорт бы их подрал. Злобные любители Паскаля здесь хохочут над нами. И они правы.

И хотя современные процессоры достаточно шустры - я-бы по возможности вообще-бы старался схильнуть с этих функций.

В данных двух предикатах нам вообще не нужно сравнивать строки. Нам нужно выпрыгнуть наверх из цикла как
только текущий item это "." или ".."

Я-бы сравнил что первый символ точка или второй.

Код: plaintext
1.
2.
dp->name[0] == '.'
dp->name[1] == '.'



Предварительно проверив что строка по длине больше чем 2 символа.

Или 1

Или наоборот проверил сначала второй.

Код: plaintext
1.
dp->name[1] == '.'



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

Код: plaintext
1.
sprintf(name, "%s/%s", dir, dp->name);



По возможности старайся не использовать форматный printf если формула - простая. А у тебя
идет просто конкатенация двух строк через разделитель.

По моему есть strcat. Ну или подумай как не делать лишних движений.

Или вообще не конкатенировать ничего. Передавай их так в lazy-style.

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

Код: plaintext
1.
2.
if (strlen(dir) + strlen(dp->name) + 2 > sizeof(name))
              fprintf(stderr, "dirwalk: name %s %s too long\n", dir, dp->name);



Что за ограничение name too long? Давайте откроем спеку современных файловых систем.

Windows кажется в Unicode гарантирует путя до 64к символов. Кажется UNC называется.

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

Код: plaintext
1.
void dirwalk(char* dir, void (*fcn)(char*))



dirwalk должен быть рекурсивным. Должен вызывать сам себя с локальными под-каталогами.
Семантика их должна быть - как относительные путя относительно текущего объекта представляющего folder.
...
Рейтинг: 0 / 0
папка это файл?
    #39997066
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья. С++ ники. А вы проверяете malloc на NULL?

Код: plaintext
1.
(dp = (DIR*)malloc(sizeof(DIR))) == NULL



Я - никогда. Я не знаю какие решения можно принять в рантайме после получения такого события.
В некотором смысле - это фатально. Это на уровне .... пожара или потопа в серверной.

Возможно программисты 20-го века и делали подобные проверки. И проверяли прерывания сбоя
чётности оперативной памяти.

Но в наше время мне кажется эту архитектуру надо разделить на разные слои отвественности.
...
Рейтинг: 0 / 0
папка это файл?
    #39997068
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Друзья. С++ ники. А вы проверяете malloc на NULL?

Каверзный вопрос. В С++ надо new использовать, а он если что исключение выбросит. А в современном коде и new уже излишен, в STL есть много чего чтобы явно new не вызывать.
...
Рейтинг: 0 / 0
папка это файл?
    #39997073
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Я - никогда. Я не знаю какие решения можно принять в рантайме после получения такого события.
В некотором смысле - это фатально. Это на уровне .... пожара или потопа в серверной.

При разработке какого-нибудь высоконагруженного сервиса, который выжимает максимум из железа, почему бы и нет?
Реакция зависит... ну от задачи, например.

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

Я - никогда. Я не знаю какие решения можно принять в рантайме после получения такого события.
В некотором смысле - это фатально. Это на уровне .... пожара или потопа в серверной.

При разработке какого-нибудь высоконагруженного сервиса, который выжимает максимум из железа, почему бы и нет?
Реакция зависит... ну от задачи, например.

Но я не пишу таких программ. :)

Возможно в embed.

Но для современного процесса в современной ОС... это просто смерть без вариантов.
...
Рейтинг: 0 / 0
папка это файл?
    #39997075
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

А в embed, которую я наблюдаю, там такой проблемы не возникает. Памяти или хватает, или нет. Там просто, проверил на NULL, если не выделилась, то устройство просто не работает, выход из main() и всё. Или вообще запрещена динамическая память. Но если разрешена, то она вся выделяется при старте приложения (один раз без free() и realoc()).
...
Рейтинг: 0 / 0
папка это файл?
    #39997076
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

попинали код с позиции современного профи .
я бы с радостью замечания все учел, если бы мог отлаживать код, а так лишь бы и это заработало и разобраться что тут к чему.
функций много глаза разбегаются. ))
Оптимизация это уже второй вопрос.


void dirwalk(char* dir, void (*fcn)(char*))
dirwalk должен быть рекурсивным.


ну тут fsize вызывает dirwalk, а dirwalk может вызвать fsize и понеслась...
в общем связаны они с друг другом рекурсивно. ну это суровый K&R так и читаем.
...
Рейтинг: 0 / 0
папка это файл?
    #39997077
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton


Но для современного процесса в современной ОС... это просто смерть без вариантов.


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

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


Но для современного процесса в современной ОС... это просто смерть без вариантов.


почему проверка malloc на нулл это смерть сейчас ??? поясните более доступным языком, пожалуйста?

А потому что Майтун мыслит в категориях программиста на высокоуровневых языка. Вот он запускает веб-сервис, запускает стресс-тестирование, смотрит монитор нагрузки -- ага всё в своп-ушло, отказов в обслуживании дофигища. Чёта не по бизнес требованиям выходит. Ну и корректирует настройки сервиса: уменьшить количество одновременных подключений. Пишет заявку: увеличить оперативку. Это упрощённо.

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


Но для современного процесса в современной ОС... это просто смерть без вариантов.


почему проверка malloc на нулл это смерть сейчас ??? поясните более доступным языком, пожалуйста?

Все банально: программа попросила выделить кусочек памяти, а в ответ - нельзя, нет свободной памяти. И что дальше делать если без этого кусочка нельзя дальше работать?

Можно не проверять, но если вернется указатель на NULL, то при попытке прочитать по этому указателю прога вылетит, читай умрет.

PS ИМХО необработанное исключение от new полезней, тут хотя бы деструкторы отработают.
...
Рейтинг: 0 / 0
25 сообщений из 230, страница 5 из 10
Форумы / C++ [игнор отключен] [закрыт для гостей] / папка это файл?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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