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

Скоро закончу читать K&R, сколько усилий было потрачено хорошо хоть на период изоляции легло. но вот они пишут , что в Unix папка представляет собой файл с которым можно проделать _open("dirname",...) , а затем собрать статистику по средствам stat(fd,...). Но у меня Win7 (файл ли там папка ?), а папку я создал, но результат функции _open -1. конкретно пытался вот так : fd = _open("dirname", _S_IREAD, 0); параметры функции не нашел где почитать про эти всякие _S_IREAD и прочее для винды (наверно ж это дело отличается в зависимости от операционки ?) . видимо на таком низком уровне никто уже не работает и никому не интересно. исходя хотелось бы помощи в следующих вопросах:

просьба подсказать как в моем случае должна выглядить fd = _open("dirname", _S_IREAD, 0); ?? с какими параметрами ?
p.s. папка реально существует там где надо. так как _open отрабатывает с простым текстовым созданным файлом
...
Рейтинг: 0 / 0
папка это файл?
    #39996359
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81как в моем случае должна выглядить fd = _open("dirname", _S_IREAD, 0); ??

Никак. Во времена K&R никакой Windows ещё не существовало даже в проекте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39996360
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81как в моем случае должна выглядить fd = _open("dirname", _S_IREAD, 0); ??

Никак. Во времена K&R никакой Windows ещё не существовало даже в проекте.


да , но _open адаптирован для обычных файлов в винде.
...
Рейтинг: 0 / 0
папка это файл?
    #39996374
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И чо? (с)

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

И чо? (с)

Уже одно его название, начинающееся с подчёркивания, говорит, что это какая-то левая
фигня, тянущаяся со времён доисторических. Удивительно не то, что оно не работает местами,
а то, что местами оно таки работает.


Хорошо тогда, но тогда наверно есть что-то обновленное.
...
Рейтинг: 0 / 0
папка это файл?
    #39996384
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andron81
папка это файл?
папка это тот, кто мамку.
...
Рейтинг: 0 / 0
папка это файл?
    #39996401
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
что в Unix папка

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

Очень ценная информация. И как я раньше жил с этим заблуждением.
...
Рейтинг: 0 / 0
папка это файл?
    #39996406
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Файлы и папки - физически это последовательность секторов на диске. Дальше правила ФС на логическом уровне делят что считать папкой, что файлом, что пустым местом и т.д. Технически можно представить папку файлом и прочитать его, но не средствами С. Вобщем тебе туда лезть не за чем. Язык С тебе дает средства для работы с файлами и папками - вот ими и пользуйся, если чего-то не хватает - есть API используемой ОС.

Если очень интересно как оно там внутри устроено, то гугли описание устройства файловой системы. В случае с виндовсом - NTFS. За полсотни лет с момента написания книги в организации ФС много чего поменялось.

PS K&R это книга по языку С, но язык далеко не все охватывает, для некоторых задач требуется дополнительно использовать средства ОС и/или специализированные библиотеки. Например если интересно все возможности виндавса поизучать - читай Рихтера Windows via C/C++ .
...
Рейтинг: 0 / 0
папка это файл?
    #39996409
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Файлы и папки - физически это последовательность секторов на диске. Дальше правила ФС на логическом уровне делят что считать папкой, что файлом, что пустым местом и т.д. Технически можно представить папку файлом и прочитать его, но не средствами С. Вобщем тебе туда лезть не за чем. Язык С тебе дает средства для работы с файлами и папками - вот ими и пользуйся, если чего-то не хватает - есть API используемой ОС.

Если очень интересно как оно там внутри устроено, то гугли описание устройства файловой системы. В случае с виндовсом - NTFS. За полсотни лет с момента написания книги в организации ФС много чего поменялось.

PS K&R это книга по языку С, но язык далеко не все охватывает, для некоторых задач требуется дополнительно использовать средства ОС и/или специализированные библиотеки. Например если интересно все возможности виндавса поизучать - читай Рихтера Windows via C/C++ .


ну так аналоги _open должны быть для винды. Задачу надо решить в концепции _open , а тут или найти аналог для винды , либо установить UNIX , либо положить болт на задачу. хочется первый вариант. а с K&R скоро нудные вопросы прекратятся - заканчивается. потерпите )))))
...
Рейтинг: 0 / 0
папка это файл?
    #39996411
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
ну так аналоги _open должны быть для винды. Задачу надо решить в концепции _open , а тут или найти аналог для винды , либо установить UNIX , либо положить болт на задачу. хочется первый вариант. а с K&R скоро нудные вопросы прекратятся - заканчивается. потерпите )))))

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

Какой аналог и почему он должен быть? В Windows нет posix. Цепляй вендовые либы, там свои реализации.
...
Рейтинг: 0 / 0
папка это файл?
    #39996416
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
andron81
ну так аналоги _open должны быть для винды. Задачу надо решить в концепции _open , а тут или найти аналог для винды , либо установить UNIX , либо положить болт на задачу. хочется первый вариант. а с K&R скоро нудные вопросы прекратятся - заканчивается. потерпите )))))

Задача какая? Получить содержимое папки виндовса? Изучай FindFirstFile() из WinAPI


ОС: win7.
задача вывести список файлов в папке. А если в папке есть подпапки тогда выводить и их файлы, если в тех есть подпапки то выводим и их файлы .... в общем по сути рекурсивный обход дерева каталогов . findfirst это как бы другая концепция решения задачи. можно , конечно. я просто думал, что вот эти _open они ведь работают для винды в случае простых файлов. предполагал, что и для моей задачи адаптированы и можно ей прочитать папку как файл.
...
Рейтинг: 0 / 0
папка это файл?
    #39996417
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
ну так аналоги _open должны быть
Кому должны??? Вам? Так вас, возможно, ещё в проектах не было, когда закладывались основы юниксов. А создателей Windows вообще никак не колыхало наличие POSIX API и подходы там другие. Можно сказать, что ещё более древние.

Условный "юниксвей" исходит из не слишком практичной мысли, что небольшого количества примитивов достаточно для (самостоятельного) изготовления "чего угодно".
На даже в POSIX API есть отдельный readdir, поскольку "проколоться" самостоятельно разбирая (известную) структуру каталога - как два пальца об асфальт.
...
Рейтинг: 0 / 0
папка это файл?
    #39996422
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
andron81
ну так аналоги _open должны быть
Кому должны??? Вам?


да мне должны ! а если серьёзно если оставили функцию _open для обычных файлов, а не бросили её и не написали свою(хотя и свои вроде бы написали, но об аналогах никто не написал), то наверно могли и к папке такое же отношение сохранить(то есть как файлу).
Название темы какое ? Папка это файл ? в винде выходит, что нет ! такого же ответа мне никто не даёт.
вот в K&R пишут, да текст древний но всё - таки :

Так как в системе UNIX каталог — это тоже файл, функции ls, чтобы добраться до имен файлов, нужно только
его прочитать. Но чтобы получить другую информацию о файле (например узнать его размер), необходимо
выполнить системный вызов. В других системах (в MS-DOS, например) системным вызовом приходится
пользоваться даже для получения доступа к именам файлов. Наша цель — обеспечить доступ к информации
по возможности системно-независимым способом несмотря на то, что реализация может быть существенно
системно-зависима.

p.s. До этого задачки под юникс в книге удавалось на винду переписать. С вашей помощью , да.
...
Рейтинг: 0 / 0
папка это файл?
    #39996446
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Basil A. Sidorov
пропущено...
Кому должны??? Вам?


да мне должны ! а если серьёзно если оставили функцию _open для обычных файлов, а не бросили её и не написали свою(хотя и свои вроде бы написали, но об аналогах никто не написал), то наверно могли и к папке такое же отношение сохранить(то есть как файлу).
Название темы какое ? Папка это файл ? в винде выходит, что нет ! такого же ответа мне никто не даёт.
вот в K&R пишут, да текст древний но всё - таки :

Так как в системе UNIX каталог — это тоже файл, функции ls, чтобы добраться до имен файлов, нужно только
его прочитать. Но чтобы получить другую информацию о файле (например узнать его размер), необходимо
выполнить системный вызов. В других системах (в MS-DOS, например) системным вызовом приходится
пользоваться даже для получения доступа к именам файлов. Наша цель — обеспечить доступ к информации
по возможности системно-независимым способом несмотря на то, что реализация может быть существенно

1. каталог это файл и в Windows, только что бы открыть его как файл нужно пользоваться WinApi, в общих библиотеках ЯП теперь такое не поощряется и при общем практическом программировании вам это дожно быть не интересно

2. системным вызовам называют вызов который перключает контекст выполнения на ядро системы. в MSDos вы сами писали системные вызовы (хотя для той модели памяти это определение и условно, физической изоляции ядра не было), напрямую вызывая прерывания, в Winapi это делают за вас реализации функции API системы (в Linux кстати тоже используется такая прослойка). Теперь описания вызовов скрыты от вас и напрямую их вызывать не стоит. во-первых они не документированы, во-вторых - могут поменяться

3. независимый способ просмотра каталогов представляют все существующие промышленные языки в своём RTL, который написан под конкретную систему, но с практически одинаковым интерфейсом для разных ОС - тынц вот этими интерфейсами и пользуйтесь на здоровье (opendir, readdir, closedir), и будет вам платформонезависимое счастье
...
Рейтинг: 0 / 0
папка это файл?
    #39996447
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

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

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


в юникс можно. а тут фигвам ...
...
Рейтинг: 0 / 0
папка это файл?
    #39996458
crutchmaster
andron81
что в Unix папка

Мамка. Папки у тебя в венде, а в unix - каталоги.

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

Скоро закончу читать K&R, сколько усилий было потрачено хорошо хоть на период изоляции легло. но вот они пишут , что в Unix папка представляет собой файл с которым можно проделать _open("dirname",...) , а затем собрать статистику по средствам stat(fd,...). Но у меня Win7 (файл ли там папка ?), а папку я создал, но результат функции _open -1. конкретно пытался вот так : fd = _open("dirname", _S_IREAD, 0); параметры функции не нашел где почитать про эти всякие _S_IREAD и прочее для винды (наверно ж это дело отличается в зависимости от операционки ?) . видимо на таком низком уровне никто уже не работает и никому не интересно. исходя хотелось бы помощи в следующих вопросах:

просьба подсказать как в моем случае должна выглядить fd = _open("dirname", _S_IREAD, 0); ?? с какими параметрами ?
p.s. папка реально существует там где надо. так как _open отрабатывает с простым текстовым созданным файлом


Мне кажется у меня дежа-вю и я уже писал тебе. Если ты - программист под Windows - то для работы с файловой системой
тебе надо использовать Windows API для работы с файлами и каталогами.

NTFS и Unix файловые системы очень архитетурно
отличаются. Например в Unix можно создавать символические линки на файлы. Можно создавать именованные канальные устройства
(файл-труба) где с одной стороны пишут и с другой читают. И есть определённые старые договорённости касающиеся наименований
файлов (case-sensitive) и Lookup (тоже case-sensitive). Есть биткарта атрибутов RWX продублированных трижды для себя
и для группы и для всех. И есть экзотические биты типа sticky. Все это в Windows НЕ РАБОТАЕТ.

Тоесть. Если ты решил и дальше серъезно углубляться в архитектуру K&R в части файловой системы
то тебе просто органически необходимо уходить с Windows. Или будешь почемучкой и
будешь постоянно приходить сюда и спрашивать почему у тебя
в Windows не выходит что-то сделать. Ты уже далеко вышел за рамки С/C++.

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

Почитай по ключевым словам Virtual File System, Inode для кругозора.
...
Рейтинг: 0 / 0
папка это файл?
    #39996497
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Задачу надо решить в концепции _open

Вы как то рано в в архитектуру полезли)
...
Рейтинг: 0 / 0
папка это файл?
    #39996500
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav
andron81,

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


в юникс можно. а тут фигвам ...

Где он этот юникс? Забей на это упражнение, эта тема нынче очень устарела, подход работы с папками в корне поменялся, потому не работает. Переходи к следующему упражнению.
...
Рейтинг: 0 / 0
папка это файл?
    #39996502
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Переходи к следующему упражнению.

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


в юникс можно. а тут фигвам ...

Где он этот юникс? Забей на это упражнение, эта тема нынче очень устарела, подход работы с папками в корне поменялся, потому не работает. Переходи к следующему упражнению.


это одно из последних, скоро глупости закончатся с моей стороны тут. Цель упражнения не архитектура и низкоуровневый фарш. надо в этих рамках и проработать. а если поставить грубо говоря виртуальную машину Юникс .
...
Рейтинг: 0 / 0
папка это файл?
    #39996522
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
а если поставить грубо говоря виртуальную машину Юникс .

Попробуй, только где его взять? Умер он давно.
https://qastack.ru/unix/33750/is-there-a-way-to-download-pure-unix Unix как отдельная сущность не существует как современная операционная система.

Как указано в комментариях для unix-производных:

Несколько систем начинали с исходного кода Unix, но со временем он был записан, поэтому оригинальный код Unix не сохранился. Наиболее известными примерами являются OpenSolaris, FreeBSD, NetBSD и OpenBSD.

...

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

а virtualBox + ubunta ?
...
Рейтинг: 0 / 0
папка это файл?
    #39996524
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Например в Unix можно создавать символические линки на файлы.

и в винде можно
...
Рейтинг: 0 / 0
папка это файл?
    #39996525
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Цель упражнения не архитектура и низкоуровневый фарш. надо в этих рамках и проработать.

Если тебе просто хочется парсить папку как файл, то сначала запускай для папки
Код: plaintext
1.
system("dir c:\folder\*.* > file.lst");


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

и в винде можно

Это очень хорошо. Тогда давайте матрицу совместимости. Операционок. И версий NTFS.
Чтоб бедного автора окончательно добить экспертизой.

Я в общем говорил. Для широкого науч-попа. В общем не поддерживает. Since какая-то версия - да.
...
Рейтинг: 0 / 0
папка это файл?
    #39996530
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил
mayton
Например в Unix можно создавать символические линки на файлы.

и в винде можно


имеешь ввиду винду 10ку ?
насколько я знаю там файловая система будет виндовая . не ?
...
Рейтинг: 0 / 0
папка это файл?
    #39996533
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
папка это файл?
    #39996535
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravНу вообще, да, всегда считалось, что папка это файл. И в винде тоже.

Если некоторые функции универсальны для папки и файла и при этом возвращают файловый
хэндл, это ещё не повод провозглашать их тождественность.

Аффтар, про readdir тебе уже сказали, займись и изучением остальных функций из
спецификации POSIX.

Ну или просто перейди с MSVC на GCC, поскольку у них (внезапно) местами разные RTL и
функция с одинаковым названием (в особенности начинающимся с подчёркивания) могут иметь
совершенно разное поведение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39996537
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

хочу это попробовать:

virtualBox + ubunta
...
Рейтинг: 0 / 0
папка это файл?
    #39996539
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Изопропил
пропущено...

и в винде можно


имеешь ввиду винду 10ку ?
насколько я знаю там файловая система будет виндовая . не ?

В 7-ке линки точно есть, пользуюсь. Для создания в Far`е нажать Alt+F6. Вроде в XP тоже было, точно не помню, но могу проверить если это важно.
В винде максимум плюшек можно получить используя NTFS, другие ФС применимы разве что для съемных носителей, которые помимо винды еще используются в невиндовых устройствах.
...
Рейтинг: 0 / 0
папка это файл?
    #39996543
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dima T,

а virtualBox + ubunta ?

убунта это linux, а linux это семейство Unix-подобных операционных систем на базе ядра Linux. Т.е. linux писался глядя на юникс, но не тупо его копируя.

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

system("dir c:\folder\*.* > file.lst");


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

Я вот читаю Роберта Лава. Книжка 2008 года. И там надо сказать есть много отсылок к стандартам Unix,
POSIX, BSD, к функционалу который морально устарел. Или не везде точно реализован. Дак это в рамках
Linux Kernel! Что вообще будет если вы ковырнете МакОС или Андроид? Там - конь не валялся.

Мы к Лаву еще вернемся когда я пушну тему кешей. Не Розовскую. А свою.
...
Рейтинг: 0 / 0
папка это файл?
    #39996549
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dima T

system("dir c:\folder\*.* > file.lst");


мы ведь таким образом только одну папку ассоциируем с фалом ?
а подпапки тоже надо. если так , то не пойдет


Код: plaintext
1.
dir /s 



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


мы ведь таким образом только одну папку ассоциируем с фалом ?
а подпапки тоже надо. если так , то не пойдет


Код: plaintext
1.
dir /s 



обходит все подкаталоги.

Подозреваю ты тут все его задание сделал целиком
...
Рейтинг: 0 / 0
папка это файл?
    #39996552
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто вообще будет если вы ковырнете МакОС или Андроид?

Внезапно в первом обнаружится ядро BSD, а во втором - линуха.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39996554
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dima T

system("dir c:\folder\*.* > file.lst");


мы ведь таким образом только одну папку ассоциируем с фалом ?
а подпапки тоже надо. если так , то не пойдет

в этом файле будет все - и подпапки и файлы. Т.е. полный аналог каталога.
Запусти консоль (cmd.exe) и выполни там
Код: plaintext
1.
dir c:\folder\*.*



PS Пост mayton`а натолкнул на мысль что ты не для себя делаешь, а чтобы студентам задавать. Если так, то не надо таким извратам детей учить.
...
Рейтинг: 0 / 0
папка это файл?
    #39996555
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonЧто вообще будет если вы ковырнете МакОС или Андроид?

Внезапно в первом обнаружится ядро BSD, а во втором - линуха.

Это прекрасно. Наша матрица еще сильнее растет.
...
Рейтинг: 0 / 0
папка это файл?
    #39996561
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь в исходном задании нет задачи с помощью _open() пронавигировать по всему дереву подпапок и файлов. А лишь прочитать аттрибуты папки воспринимая папку как файл. Не знаю устройство NTFS но вполне допускаю, что и там папка -- это в первую очередь файл, к которому прицеплен список дочерних элементов.
...
Рейтинг: 0 / 0
папка это файл?
    #39996564
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда думаете в парадигме Windows - мысленно представляйте что в файловой системе
смонтирован весь набор возможных систем таких как

- NTFS 4.x, 5.x .... e.t.c.
- FAT32 (флешка)
- ExFat (еще одна чортова флешка тоже)

И нет никаких оснований исключать что таких случаев не будет. Ну или к списку можно
добавить внешний сетевой диск (кажется проткол SMB/CIFS).
...
Рейтинг: 0 / 0
папка это файл?
    #39996574
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как раз о Кернигане и Риччи:
https://stackoverflow.com/questions/21405048/linux-open-directory-as-a-file
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39996637
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Когда думаете в парадигме Windows - мысленно представляйте что в файловой системе
смонтирован весь набор возможных систем таких как

- NTFS 4.x, 5.x .... e.t.c.
- FAT32 (флешка)
- ExFat (еще одна чортова флешка тоже)

И нет никаких оснований исключать что таких случаев не будет. Ну или к списку можно
добавить внешний сетевой диск (кажется проткол SMB/CIFS).

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

Вы его запутываете еще дальше. Какой прикладной смысл ему знать это?
...
Рейтинг: 0 / 0
папка это файл?
    #39996683
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Контр-продуктивно педалировать тему "фолдер==файл" для нашего топик-стартера.

Вы его запутываете еще дальше. Какой прикладной смысл ему знать это?

А зачем это у К&R ? Как раз очень полезно: наводит на мысли как могла бы быть реализована ФС.
...
Рейтинг: 0 / 0
папка это файл?
    #39996689
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я даже более скажу. Почти все ФС на уровне внутренней структуры реализуют фолдеры как файлы.
Даже самый древний FAT-12bit на дискетках. Но вы это знание не сможете обобщить. Ни к VFS,
ни к сетевым протоколам ни к древовидным БД вы не пришъете эту метафору.

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

Поэтому я и говорю. Забавный инженерный факт. Но зачем это юноше изучающему С ?

Для общего развития.

А что такое FAR-12bit ?
...
Рейтинг: 0 / 0
папка это файл?
    #39996694
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил. Тороплюсь. Очепятки делаю.
...
Рейтинг: 0 / 0
папка это файл?
    #39996695
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Кстати, если бы мы реализовывали дерево (не бинарное) в памяти... причём в этом дереве могли бы быть элементы различных типов и папки. То очень может быть, что в дереве бы хранились INode * , а класс "Folder" был бы наследником от "INode".

Опыт отлично обобщается, как видите.
...
Рейтинг: 0 / 0
папка это файл?
    #39996697
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Какой прикладной смысл ему знать это?
Чтобы API учил, а не хватался за первую попавшуюся функцию.
...
Рейтинг: 0 / 0
папка это файл?
    #39996698
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton,

Кстати, если бы мы реализовывали дерево (не бинарное) в памяти... причём в этом дереве могли бы быть элементы различных типов и папки. То очень может быть, что в дереве бы хранились INode * , а класс "Folder" был бы наследником от "INode".

Опыт отлично обобщается, как видите.

Это - всё структуры оптимизированные для диска. Для программирования в общем виде они лишены смысла.
...
Рейтинг: 0 / 0
папка это файл?
    #39996701
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, давай чтоб здесь не флудить поднимем отдельную тему - файловые системы и их организация
и там поделимся мыслями. Я хотел создать ФС для временных файлов. Rotate-FS. (Rot-fs) где файлы
пишуться по кругу и автоматически удаляются когда нет места. По сути такой себе Redis огромного
размера на диске. Хотел обсудить ведение приоритетов и эвристик для сохранения файлов
которые "всё таки нужны на всякий случай".
...
Рейтинг: 0 / 0
папка это файл?
    #39996704
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Поднимайте, тока я не разбираюсь в ФС-ах.
...
Рейтинг: 0 / 0
папка это файл?
    #39996745
mayton
Я хотел создать ФС для временных файлов. Rotate-FS. (Rot-fs) где файлы
пишуться по кругу и автоматически удаляются когда нет места.

файлы то разные по размеру все... и чё будет, когда ты потрёшь файл 100 кб, а надо записать 200кб?
...
Рейтинг: 0 / 0
папка это файл?
    #39996781
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видишь как замечательно. Уже есть о чем говорить.
И тема - инженерная. Без теологии с филисофией типа считать демонов ангелами, а фолдеры - файлами.
...
Рейтинг: 0 / 0
папка это файл?
    #39996789
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
petrav, давай чтоб здесь не флудить поднимем отдельную тему - файловые системы и их организация
и там поделимся мыслями. Я хотел создать ФС для временных файлов. Rotate-FS. (Rot-fs) где файлы
пишуться по кругу и автоматически удаляются когда нет места. По сути такой себе Redis огромного
размера на диске. Хотел обсудить ведение приоритетов и эвристик для сохранения файлов
которые "всё таки нужны на всякий случай".

Это не совсем временные файлы получаются, а какой-то вытесняющий кэш.

Для временных все уже есть. В виндавсе достаточно указать флаг при создании файлов
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea CreateFileA function
...
FILE_ATTRIBUTE_TEMPORARY
The file is being used for temporary storage.
For more information, see the Caching Behavior section of this topic.
В линуксе
http://opennet.ru/cgi-bin/opennet/man.cgi?topic=tmpfile FILE *tmpfile (void);

Функция tmpfile() создает уникальное имя временного файла. Временный файл открывается в двоичном режиме ввода-вывода (w+b). Файл автоматически удаляется при его закрытии или в случае нормального завершения основной программы.
...
Рейтинг: 0 / 0
папка это файл?
    #39996854
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
mayton
petrav, давай чтоб здесь не флудить поднимем отдельную тему - файловые системы и их организация
и там поделимся мыслями. Я хотел создать ФС для временных файлов. Rotate-FS. (Rot-fs) где файлы
пишуться по кругу и автоматически удаляются когда нет места. По сути такой себе Redis огромного
размера на диске. Хотел обсудить ведение приоритетов и эвристик для сохранения файлов
которые "всё таки нужны на всякий случай".

Это не совсем временные файлы получаются, а какой-то вытесняющий кэш.

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

Насобирали материала для пятничного вопроса?

Возможно я действительно делаю не аналог /tmp а нечто другое.
...
Рейтинг: 0 / 0
папка это файл?
    #39996890
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ линуксе

Во-первых, в линуксе уже лучше использовать O_TMPFILE.
Во-вторых, эти флаги делают совершенно разные вещи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39996904
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton


Поэтому я и говорю. Забавный инженерный факт. Но зачем это юноше изучающему С ? Он что
будет лечить файловые системы? Для этого уже пол-века есть готовые утилиты которые прекрасно
работают.


Мне как минимум надо прогнать программу и понять как она работает. Суть тут как я и говорил не в низкоуровневом фарше. Там и всякие конструкции вместе с этим. Например указатель на функцию которая только второй раз всплыла.

Да и юношей меня назвать сложно. Мне 39.
...
Рейтинг: 0 / 0
папка это файл?
    #39996909
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

Буду пробовать поднять виртуальную машину и натягивать код из k&r. А слить каталоги в файл при помощи system или просто слить с командной строки в файл и читать, идея не пошла. Во первых там мусор какой-то который я могу вручную убрать, но там еще и структура, а код будет читать посредствам read будет ли это соотвествовать той юниксовой структуре не очень понятно так как последняя мне не доступна.
...
Рейтинг: 0 / 0
папка это файл?
    #39996913
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема роутинга файлов и директорий в Windows/Unix всплывает часто. И я до сих пор не пойму
почему она так сложна? Рекурсия? Или непонимание файловой организации?

Как модератор я ставлю вопрос о добавлении этих исходников в непотопляемый FAQ.
Давайте уже 1 раз напишем эталонную реализацию и будем на нее ссылаться.

Если API будет несколько (проприетарный) и адаптированный через rtl то сделаем варианты.
...
Рейтинг: 0 / 0
папка это файл?
    #39996915
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая-такая эталонная реализация???
Человек хочет странного - идентичный код для винды и юниксов. Иногда это возможно, иногда - не очень.
...
Рейтинг: 0 / 0
папка это файл?
    #39996916
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКак модератор я ставлю вопрос о добавлении этих исходников в непотопляемый FAQ.
Давайте уже 1 раз напишем эталонную реализацию и будем на нее ссылаться.

Она уже написана:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/*
  * readdir.c: example usage for opendir()/readdir()/closedir()
  *
  * Matt Dailey, Feb 2004
  *
  * Compile with "gcc readdir.c" to get executable a.out.
  *
  * This example program prints out the files in the current
  * directory
  *
  * Be sure to refer to "man 3 readdir" etc.
  *
  */


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39996919
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, мне нужно время чтоб проверить эту инфу и чуть позже я добавлю ее в FAQ.
...
Рейтинг: 0 / 0
папка это файл?
    #39996921
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Тема роутинга файлов и директорий в Windows/Unix всплывает часто. И я до сих пор не пойму
почему она так сложна? Рекурсия? Или непонимание файловой организации?

Как модератор я ставлю вопрос о добавлении этих исходников в непотопляемый FAQ.
Давайте уже 1 раз напишем эталонную реализацию и будем на нее ссылаться.

Если API будет несколько (проприетарный) и адаптированный через rtl то сделаем варианты.


как это работает на пальцах я понимаю в том числе и рекрсивный алгоритм (бывают и по сложнее)
Но там несколько функций и их несколько со сложными конструкциями , а K&R любят сложные , но короткие коды.
А читать по книжке и на ходу понимать и представлять пока не умею. поэтому я коды все пропечатываю от руки и прорабатываю.
а тут под виндами не работает.
...
Рейтинг: 0 / 0
папка это файл?
    #39996934
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
mayton
Тема роутинга файлов и директорий в Windows/Unix всплывает часто. И я до сих пор не пойму
почему она так сложна? Рекурсия? Или непонимание файловой организации?

Как модератор я ставлю вопрос о добавлении этих исходников в непотопляемый FAQ.
Давайте уже 1 раз напишем эталонную реализацию и будем на нее ссылаться.

Если API будет несколько (проприетарный) и адаптированный через rtl то сделаем варианты.


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

K&R использовали старые подходы в типизации которые сегодня - неприменимы.
Хороший тайп-кастинг в современных языках - практически всегда проверяется на валидность
либо на компилляции либо на RTTI. Хорошее булево правило стоящее в условии if не примемлет
целого числа как аргумента. Требуется явный кастинг в булеан.

Можно сказать что "C" и ассемблер это последний старичок-язык которые все еще позволяет
играть целыми числами или не дай бог указателями как булевыми величинами.

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

И указатели на функции - тоже в современных языках заменяюся на виртуальные методы
и шаблон RCWP.
...
Рейтинг: 0 / 0
папка это файл?
    #39996936
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, да чуть-чуть осталось . мне уже самому надоела книжка , но надо домучить. к тому же кстати она у вас заявлена в теме про книги по Си которая в топе !
...
Рейтинг: 0 / 0
папка это файл?
    #39996943
andron81
mayton, да чуть-чуть осталось . мне уже самому надоела книжка , но надо домучить. к тому же кстати она у вас заявлена в теме про книги по Си которая в топе !

сдался тебе тот C. Время зря теряешь.
C++ наше всё
и там есть <filesystem>
...
Рейтинг: 0 / 0
папка это файл?
    #39996948
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза 2020
andron81
mayton, да чуть-чуть осталось . мне уже самому надоела книжка , но надо домучить. к тому же кстати она у вас заявлена в теме про книги по Си которая в топе !

сдался тебе тот C. Время зря теряешь.
C++ наше всё
и там есть <filesystem>


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

сдался тебе тот C. Время зря теряешь.
C++ наше всё
и там есть <filesystem>

Я не против. Мне по работе С++ все равно не нужен. Высокоуровневые вещи делаю на другом.
"C" как объект для изучения нужен в тех топиках где мы приближаемся к конкретной операционке.
И для ее разработки С наверное подходит лучше чем С++.
...
Рейтинг: 0 / 0
папка это файл?
    #39996951
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
для разработки чего ?
...
Рейтинг: 0 / 0
папка это файл?
    #39996953
andron81
Алексей Роза 2020
пропущено...

сдался тебе тот C. Время зря теряешь.
C++ наше всё
и там есть <filesystem>


плюсы это следующий этап. в плюсах без указателей делать не фиг.

ошибаешься, это в C делать без указателей нефиг, а в C++ есть ссылки.
И они предпочтительней указателей, т.к. nullptr не словишь случайно.
И никакой это не "следующий этап"... это отдельный самостоятельный этап, которому нахрен этот C не сдался. Наоборот - он будет только мешать.
Тебе создатель языка (Страуструп) открытым текстом говорит: "не тратьте время на C, сразу садитесь за C++".
mayton
Я не против. Мне по работе С++ все равно не нужен. Высокоуровневые вещи делаю на другом.
"C" как объект для изучения нужен в тех топиках где мы приближаемся к конкретной операционке.
И для ее разработки С наверное подходит лучше чем С++.

ты ж говорил, что прикладник...
C сегодня это уже совсем для чего-то низкоуровневого там, типа дров и микроконтроллеров.
Ну и линукса
...
Рейтинг: 0 / 0
папка это файл?
    #39996959
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза 2020Тебе создатель языка (Страуструп) открытым текстом говорит: "не тратьте время на C, сразу
садитесь за C++".

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

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

Автор у тебя все получилось с туториалом?
...
Рейтинг: 0 / 0
папка это файл?
    #39996967
Алексей Роза 2020
ошибаешься, это в C делать без указателей нефиг, а в C++ есть ссылки.
И они предпочтительней указателей, т.к. nullptr не словишь случайно.
И никакой это не "следующий этап"... это отдельный самостоятельный этап, которому нахрен этот C не сдался. Наоборот - он будет только мешать.
Тебе создатель языка (Страуструп) открытым текстом говорит: "не тратьте время на C, сразу садитесь за C++".

при этом, кстати, обязательно надо отметить, что сам код в C++ должен быть максимально простым и понятным
Таким же простым, как C
KISS - Keep It Simple Stupid
...
Рейтинг: 0 / 0
папка это файл?
    #39996968
Dimitry Sibiryakov
Алексей Роза 2020Тебе создатель языка (Страуструп) открытым текстом говорит: "не тратьте время на C, сразу
садитесь за C++".

Создатели всех языков так говорят, но надо же понимать, что их цели при этом -
исключительно маркетинговые.
да ну не.
ты типа не согласен, что C убог?
там в разы проще ошибку совершить (при том же оверхеде) - уже это его косит.
...
Рейтинг: 0 / 0
папка это файл?
    #39996970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза 2020обязательно надо отметить, что сам код в C++ должен быть максимально простым и понятным

То есть не использовать 99% этого языка, ограничиваясь "Си с объектами". Прелестно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39996971
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
andron81,

Буду пробовать поднять виртуальную машину и натягивать код из k&r. А слить каталоги в файл при помощи system или просто слить с командной строки в файл и читать, идея не пошла. Во первых там мусор какой-то который я могу вручную убрать, но там еще и структура, а код будет читать посредствам read будет ли это соотвествовать той юниксовой структуре не очень понятно так как последняя мне не доступна.

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

А что это? Что-то даже гугл не ищет.
...
Рейтинг: 0 / 0
папка это файл?
    #39996973
Dimitry Sibiryakov
Алексей Роза 2020обязательно надо отметить, что сам код в C++ должен быть максимально простым и понятным

То есть не использовать 99% этого языка, ограничиваясь "Си с объектами". Прелестно.
не настолько
...
Рейтинг: 0 / 0
папка это файл?
    #39996976
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Как модератор я ставлю вопрос о добавлении этих исходников в непотопляемый FAQ.
Давайте уже 1 раз напишем эталонную реализацию и будем на нее ссылаться.


я бы посмотрел на такую функцию


У меня есть проблема в проекте. Нужно под Windows окружением определять размеры каталогов на кластерном файловом хранилище удаленно, но в пределах LAN (протокол SMB/Ethernet). Проблема в том, что скорость рекурсивного обхода каталога при использовании FindFirst/FindNextFile оставляет желать лучшего, если в каталоге довольно много (сотни тысяч) файлов/каталогов и (не)приличная глубина вложенности. Если полазить по всяким stackoverflow , то можно выяснить, что для Windows якобы ничего более производительного, чем использование указанных API функций, нет. Причем у этих функций есть Ex варианты , в которых можно указать ряд оптимизирующих флагов. Пробовал - мало толку, потому что все равно остается еще много лишнего мусора, который ОС тащит из NTFS. При этом не спасает даже то, что сам исследуемый каталог может находиться на суровом enterprise JBOD/RAID из SSD дисков.

Была идея вынести рассчеты на локальный уровень посредством служб(ы), чтобы избежать overhead'a SMB протокола. Это реально дает прирост производительности, но все равно, не настолько насколько хотелось бы. А хотелось бы приблизиться к производительности Windows Explorer и идеале обойти его.

В целом, если сравнивать мою наивную реализацию на FindFirst/FindNextFile и ту реализацию, которая используется в Explorer'e (открыть каталог, правой кнопкой мыши, посмотреть свойства), то создается впечатление, что Проводник не использует FindFirst/NextFile API, либо использует их как-то очень хитро, потому что производительность его рассчетов значительно превышает производительность указанных функций в моей реализации (проводил как-то анализ на "холодных" данных/кэше).

Подозреваю, что придется нырнуть ближе к ядру и MFT, благо в MSDN много чего описано на этот счет, но пока руки не доходят...

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

А что это? Что-то даже гугл не ищет.

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

может CRTP?
...
Рейтинг: 0 / 0
папка это файл?
    #39996981
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumесли сравнивать мою наивную реализацию на FindFirst/FindNextFile
Так, может, ты её покажешь сначала? А то вдруг окажется, что ты наступил на что-то
примитивное. Например, уходишь в рекурсию не дочитав текущий каталог до конца.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39996982
Cerebrum
Проблема в том, что скорость рекурсивного обхода каталога при использовании FindFirst/FindNextFile оставляет желать лучшего, если в каталоге довольно много (сотни тысяч) файлов/каталогов и (не)приличная глубина вложенности.

кстати, вот в линухе с nfs тоже проблема непонятная - очень медленно работает... и copy, и всё остальное
ну т.е. там нет даже близко 100мбит, даже когда их 1000 мбит
...
Рейтинг: 0 / 0
папка это файл?
    #39996985
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Так, может, ты её покажешь сначала? А то вдруг окажется, что ты наступил на что-то
примитивное. Например, уходишь в рекурсию не дочитав текущий каталог до конца.

может и покажу, но пока нет особо времени на адаптацию кода.
выкладывать вариант, который никто потестить не сможет, не вижу смысла

но сразу скажу, что там нет ничего сверхестественного, все довольно примитивно:
обходим каталоги, строим полный путь складывая имена каталогов с предыдущими сегментами путей, извлекаем размер файлов, накапливаем их в total size переменную. Все в рамках WinAPI, выше головы, как говорится, не прыгнешь
...
Рейтинг: 0 / 0
папка это файл?
    #39996997
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза 2020
Cerebrum
Проблема в том, что скорость рекурсивного обхода каталога при использовании FindFirst/FindNextFile оставляет желать лучшего, если в каталоге довольно много (сотни тысяч) файлов/каталогов и (не)приличная глубина вложенности.

кстати, вот в линухе с nfs тоже проблема непонятная - очень медленно работает... и copy, и всё остальное
ну т.е. там нет даже близко 100мбит, даже когда их 1000 мбит

Какая версия nfs? Если для каждого файла мы используем 1 сетевой roundtrip то понятно что будет вычитка
файлов медленно. Чтоб обсуждать тему детально - нужны описания условия эксперимента. Клиент. Сервер.
И тестовый объем данных где это тестировалось. Убежден что в linux эта проблема архитектурно решена.
Мы просто не слыхали об том как ее правильно решать.
...
Рейтинг: 0 / 0
папка это файл?
    #39997003
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumВсе в рамках WinAPI, выше головы, как говорится, не прыгнешь

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

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

FindFirst/FindNextFile

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

FindFirst/FindNextFile

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

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

Там тебя ждёт сюрприз в виде понимания, что "размер каталога" и "размер файлов в каталоге"
- две разные вещи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997010
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

Там тебя ждёт сюрприз в виде понимания, что "размер каталога" и "размер файлов в каталоге"
- две разные вещи.

Не пугайте парня.

Из сферы Unix(K&R, Linux, C). Можно посмотреть исходники утилиты tar и потрассировать ее работу в рантайме.
Из всех утилит что работают с файловой системой она быстрее всех справляется с операциями слияния тысяч
мелких файлов в один. Также и в обратку. Я спецом сравнивал ее с zip и другими тулзами и пришел к выводу
что tar - самый быстрый на локальной файловой системе. Какие гвозди в него вбиты - надо разбираться.
Но там будут многие ответы на вопросы по оптимизации.

Из сферы Windows. Самая быстрая тулза для копирования россыпи файлов - это ntbackup.exe.
Вот челлендж. Кто раскурит ее сорцы? ИЛи кто знает как она работает внутри. Там - тоже сакральное
знание про NTFS.
...
Рейтинг: 0 / 0
папка это файл?
    #39997011
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

CerebrumВсе в рамках WinAPI, выше головы, как говорится, не прыгнешь

Ну, как я уже говорил, можно уходить в рекурсию по каталогам сразу или складывать
найденные каталоги в очередь чтобы обработать их позже, после завершения текущего. Второе
эффективнее и позволяет попробовать распараллелить процесс.
Можно пояснить почему вы считаете второй подход эффективнее? Он, наверное, был бы
эффективнее если бы FindFirstFile() порождал бы в оперативке список всех файлов данного
каталога. Но мне это кажется не верным. Или допустим эффективнее потому что все inode
файлов данного каталога лежат на диске непрерывным вектором.

По поводу распаралеливания -- ну тоже странно. Там узкое горлышко будет в дисковых
операциях. Ну зачем тут паралелить?
...
Рейтинг: 0 / 0
папка это файл?
    #39997013
mayton
ИЛи кто знает как она работает внутри.

индусы
...
Рейтинг: 0 / 0
папка это файл?
    #39997015
mayton
Алексей Роза 2020
пропущено...

кстати, вот в линухе с nfs тоже проблема непонятная - очень медленно работает... и copy, и всё остальное
ну т.е. там нет даже близко 100мбит, даже когда их 1000 мбит

Какая версия nfs? Если для каждого файла мы используем 1 сетевой roundtrip то понятно что будет вычитка
файлов медленно. Чтоб обсуждать тему детально - нужны описания условия эксперимента. Клиент. Сервер.
И тестовый объем данных где это тестировалось. Убежден что в linux эта проблема архитектурно решена.
Мы просто не слыхали об том как ее правильно решать.

v4 или 4.1
эта проблема была ещё лет 15 назад
у меня реально линух с/на самбу копирует быстрее, чем линух с/на nfs
и чистая винда тоже быстрее
а чё она решена? NFS 100 лет в обед. Сервер ставится и работает. Какие проблемы там решать столько лет?!
Я могу конечно грешить на свои кривые руки... но блин, я поставил сервер, а он сходу еле копирует.
И настраивать пытался.
...
Рейтинг: 0 / 0
папка это файл?
    #39997016
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза 2020
mayton
пропущено...

Какая версия nfs? Если для каждого файла мы используем 1 сетевой roundtrip то понятно что будет вычитка
файлов медленно. Чтоб обсуждать тему детально - нужны описания условия эксперимента. Клиент. Сервер.
И тестовый объем данных где это тестировалось. Убежден что в linux эта проблема архитектурно решена.
Мы просто не слыхали об том как ее правильно решать.

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


А здесь https://www.sql.ru/forum/linux спрашивал?
...
Рейтинг: 0 / 0
папка это файл?
    #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
папка это файл?
    #39997084
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
andron81
пропущено...


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

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

Отказываться работать, вот что делать. Пишем свой Фотошоп. Два варианта на открытии файла:

- Не хватило памяти.
- Файл неверного формата.

MsgBox().

В случае вебсервиса -- отказ в обслуживании, держитесь там, заходите позжее.

Dima T

PS ИМХО необработанное исключение от new полезней, тут хотя бы деструкторы отработают.

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


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


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

Потому что не существует никакого ценного принятия решения по этому поводу.

Давай порассуждаем. Ты написал приложение. Бизнес-приложение. Которое выполняет
полезную работу. И вдруг. На каком-то этапе приложение не может аллоцировать память.
Работа дальше заблокирована. Давай придумай какой-то план выхода из этой ситуации
и мы обсудим насколько он реалистичен.

Напомню что приложение - это не привет-мир. Это бизнес-приложение которое обычно
держит несколько сотен сетевых коннектов к базам и сервисам и в режиме event-driven
реагирует на бизнес события сети. И эта активность - не прекращается.

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

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

Из сферы Unix(K&R, Linux, C). Можно посмотреть исходники утилиты tar и потрассировать ее работу в рантайме.
Из всех утилит что работают с файловой системой она быстрее всех справляется с операциями слияния тысяч
мелких файлов в один. Также и в обратку. Я спецом сравнивал ее с zip и другими тулзами и пришел к выводу
что tar - самый быстрый на локальной файловой системе. Какие гвозди в него вбиты - надо разбираться.
Но там будут многие ответы на вопросы по оптимизации.


Я решил сделать для начала не tar а du (DiskUsage). Он не копирует а просто обходит структуру фолдеров.

Вот что получилось по системным вызовам. Запускал по своему /home каталогу

Фрагмент лога strace
Код: 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.
21:14:37.973151 write(1, "12\t../Documents/students/Dmitriy"..., 63) = 63
21:14:37.973190 newfstatat(4, "cb", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.973233 openat(4, "cb", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_CLOEXEC|O_DIRECTORY) = 3
21:14:37.973266 fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
21:14:37.973296 fcntl(3, F_GETFL)       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_NOFOLLOW|O_DIRECTORY)
21:14:37.973323 fcntl(3, F_SETFD, FD_CLOEXEC) = 0
21:14:37.973349 newfstatat(4, "cb", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.973383 fcntl(3, F_DUPFD_CLOEXEC, 3) = 8
21:14:37.973410 getdents64(3, /* 4 entries */, 32768) = 176
21:14:37.973448 getdents64(3, /* 0 entries */, 32768) = 0
21:14:37.973475 close(3)                = 0
21:14:37.973501 newfstatat(8, "1acc8602a287cfe829af9cf7b8049dfeef779e", {st_mode=S_IFREG|0644, st_size=52, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.973541 newfstatat(8, "0e8052df20aace2783e9c9f3d468dd2d29e610", {st_mode=S_IFREG|0644, st_size=161, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.973576 close(8)                = 0
21:14:37.973606 write(1, "12\t../Documents/students/Dmitriy"..., 63) = 63
21:14:37.973646 newfstatat(4, "d6", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.973688 openat(4, "d6", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_CLOEXEC|O_DIRECTORY) = 3
21:14:37.973721 fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
21:14:37.973751 fcntl(3, F_GETFL)       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_NOFOLLOW|O_DIRECTORY)
21:14:37.973777 fcntl(3, F_SETFD, FD_CLOEXEC) = 0
21:14:37.973805 newfstatat(4, "d6", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.973838 fcntl(3, F_DUPFD_CLOEXEC, 3) = 8
21:14:37.973865 getdents64(3, /* 3 entries */, 32768) = 112
21:14:37.973906 getdents64(3, /* 0 entries */, 32768) = 0
21:14:37.973948 close(3)                = 0
21:14:37.973989 newfstatat(8, "41210dbf79efd66962616924bdae854f805652", {st_mode=S_IFREG|0644, st_size=64, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.974043 close(8)                = 0
21:14:37.974087 write(1, "8\t../Documents/students/Dmitriy."..., 62) = 62
21:14:37.974145 newfstatat(4, "e9", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.974205 openat(4, "e9", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_CLOEXEC|O_DIRECTORY) = 3
21:14:37.974254 fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
21:14:37.974300 fcntl(3, F_GETFL)       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_NOFOLLOW|O_DIRECTORY)
21:14:37.974343 fcntl(3, F_SETFD, FD_CLOEXEC) = 0
21:14:37.974384 newfstatat(4, "e9", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
21:14:37.974442 fcntl(3, F_DUPFD_CLOEXEC, 3) = 8
21:14:37.974485 getdents64(3, /* 3 entries */, 32768) = 112
21:14:37.974537 getdents64(3, /* 0 entries */, 32768) = 0
21:14:37.974580 close(3)      



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

сложный вопрос для меня от человека умудренного опытом.
ну в данном случае наверно высвечиваем "нехватка памяти для размещения структуры DIR и сливаем эту фразу в лог, а затем выход.

Верно. Все что мы можем сделать - это вывалиться с сообщением об аварии.
Более того. Даже сама процедура аварийного выхода может не сработать т.к.
ей для корректного завершения (!) сюрприз тоже может понадобиться память.

Ведь если ты пишешь качественное бизнес-приложение - ты обязан закрыть корректно
все курсоры в БД. Завершить транзакции в деструкторах твоих бизнес-процессов.

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

сложный вопрос для меня от человека умудренного опытом.
ну в данном случае наверно высвечиваем "нехватка памяти для размещения структуры DIR и сливаем эту фразу в лог, а затем выход.

Конечно. Так и делают библиотеки на которые опирается Майтун. А он, соответственно, не знает как реагировать на ситуации, которые отрабатывает базовая библиотека. Из этого делается вывод: на эти ситуации отреагировать невозможно. Но вывод ошибочный.
...
Рейтинг: 0 / 0
папка это файл?
    #39997100
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще я вот думаю наверно надо как советовал злой Сибиряков: забить болт на реализацию readdir, opendir и closedir. Воспользоваться ими из библиотеки и закрыть тему.
...
Рейтинг: 0 / 0
папка это файл?
    #39997131
Dima T
Все банально: программа попросила выделить кусочек памяти, а в ответ - нельзя, нет свободной памяти. И что дальше делать если без этого кусочка нельзя дальше работать?

отобрать у другой программы, очевидно же
весь мир так устроен, чё велосипед изобретать
...
Рейтинг: 0 / 0
папка это файл?
    #39997132
mayton
Алексей Роза 2020
пропущено...

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

А здесь https://www.sql.ru/forum/linux спрашивал?

я гуглил, а эта проблема так то распространённая
у меня он 1.8гб файл копирует быстро до 50%, а потом еле-еле, практически виснет
винда в/на самбу его скопирует за неск. секунд

petrav
Алексей Роза 2020

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

Так может драйвер NTFS под Линукс кривой?

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

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

а в паскале как?
...
Рейтинг: 0 / 0
папка это файл?
    #39997136
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
ntbackup.exe.
"Они убили Кенни!"Там - тоже сакральное знание про NTFS.Нет там сакрального знания - там есть Backup API.
...
Рейтинг: 0 / 0
папка это файл?
    #39997138
mayton
Ожидаю ваших активных комментариев.

ты тоже Dmitriy?
mayton
Верно. Все что мы можем сделать - это вывалиться с сообщением об аварии.

а чё вы со свопом сделали, м?
...
Рейтинг: 0 / 0
папка это файл?
    #39997139
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Бизнес-приложение. Которое выполняет полезную работу. И вдруг. На каком-то этапе приложение не может аллоцировать память. Работа дальше заблокирована.
Можно OOM-парашют выкинуть, можно кэши подрезать или собственных осетров. Много чего, в общем, можно сделать.

P.S.
Точка - не единственный знак препинания.Приложение выполняет полезную работу и вдруг, на каком-то этапе, не может выделить память. Всё - дальше работа заблокирована.
...
Рейтинг: 0 / 0
папка это файл?
    #39997141
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза 2020
Dima T
Все банально: программа попросила выделить кусочек памяти, а в ответ - нельзя, нет свободной памяти. И что дальше делать если без этого кусочка нельзя дальше работать?

отобрать у другой программы, очевидно же
весь мир так устроен, чё велосипед изобретать

Микроконтроллер? У кого отберёт?
...
Рейтинг: 0 / 0
папка это файл?
    #39997144
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза 2020
mayton
Ожидаю ваших активных комментариев.

ты тоже Dmitriy?
mayton
Верно. Все что мы можем сделать - это вывалиться с сообщением об аварии.

а чё вы со свопом сделали, м?

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

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

Даже сама процедура аварийного выхода может не сработать т.к.
ей для корректного завершения (!) сюрприз тоже может понадобиться память.


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

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

Странная логика. Память не аллоцировалась потому что ее нет.


скажем я запросил аллоцировать 20Г, а свободно 500Мб. malloc выдал null. ну наверно ж 500Мб на то чтобы выдать сообщение хватит .
...
Рейтинг: 0 / 0
папка это файл?
    #39997157
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза 2020
mayton
Функции подобные strlen, strcmp имеют линейный расчет сложности. Тоесть чем длиннее строка тем они дольше
делают перемотку вперед. 2х гигабайтная строка будет считаться несколько секунд. Примерно как memory тест
при старте старых комьютеров. Когда черный экран Биоса нам освящает загрузку.

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

а в паскале как?

Там разные строки были. Был вариант с хранением длины. Как в std::string. И был вариант pchar это наподобие
сишных ASCIIZ. И кажется еще было несколько библиотечных вариантов. Ну в основном использовался первый вариант.
...
Рейтинг: 0 / 0
папка это файл?
    #39997159
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dima T
пропущено...

Странная логика. Память не аллоцировалась потому что ее нет.


скажем я запросил аллоцировать 20Г, а свободно 500Мб. malloc выдал null. ну наверно ж 500Мб на то чтобы выдать сообщение хватит .

Да. Для девопсовской или админской задачи такой вариант подходит. Приложение не взлетело при старте.
Админ зашел в конфигурацию. И вместо size=20G указал size=14G к примеру и всё стартовало успешно.
Но на практике, подобные пробирующие алгоритмы не работают потому что память нужна срочно и многим
работающим потокам. И если уже дошло до того что приложение работало несколько месяцев и вдруг
не смогло выделить память - то всё очень плохо и вот эта игра на понижение... или этот торг ну окей
я не смог взять 20Гиг так возьму 20 минус 500 метров - уже не очень полезен. Где-то есть утечка.
Надо разбираться.

Хочешь я в нашем форуме просто ради прикола подниму штук 10 старых топиков где есть malloc и мы просто
обсудим какие умные принятия решения можно сделать именно здесь и сейчас в исходнике? И окажется
что вобщем-то никаких. Можем просто падать с сообщением в STDERR.
...
Рейтинг: 0 / 0
папка это файл?
    #39997166
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
andron81
пропущено...


скажем я запросил аллоцировать 20Г, а свободно 500Мб. malloc выдал null. ну наверно ж 500Мб на то чтобы выдать сообщение хватит .

Да. Для девопсовской или админской задачи такой вариант подходит. Приложение не взлетело при старте.
Админ зашел в конфигурацию. И вместо size=20G указал size=14G к примеру и всё стартовало успешно.
Но на практике, подобные пробирующие алгоритмы не работают потому что память нужна срочно и многим
работающим потокам. И если уже дошло до того что приложение работало несколько месяцев и вдруг
не смогло выделить память - то всё очень плохо и вот эта игра на понижение... или этот торг ну окей
я не смог взять 20Гиг так возьму 20 минус 500 метров - уже не очень полезен. Где-то есть утечка.
Надо разбираться.

Хочешь я в нашем форуме просто ради прикола подниму штук 10 старых топиков где есть malloc и мы просто
обсудим какие умные принятия решения можно сделать именно здесь и сейчас в исходнике? И окажется
что вобщем-то никаких. Можем просто падать с сообщением в STDERR.


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

у меня какие-то приступы энтузиазма на старости лет. вот к примеру книги читаю 40 летней давности:)
...
Рейтинг: 0 / 0
папка это файл?
    #39997168
mayton
Был вариант с хранением длины.

так а длина не через strlen() вычислялась? Или тут strlen() в цикле?
...
Рейтинг: 0 / 0
папка это файл?
    #39997173
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Хочешь я в нашем форуме просто ради прикола подниму штук 10 старых топиков где есть malloc и мы просто
обсудим какие умные принятия решения можно сделать именно здесь и сейчас в исходнике? И окажется
что вобщем-то никаких. Можем просто падать с сообщением в STDERR.

Я хочу, поднимите один топик, для начала.

PS: И не падать, а корректно выходить, тоже вариант.
...
Рейтинг: 0 / 0
папка это файл?
    #39997176
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Алексей Роза 2020
пропущено...

а в паскале как?

Там разные строки были. Был вариант с хранением длины. Как в std::string. И был вариант pchar это наподобие
сишных ASCIIZ. И кажется еще было несколько библиотечных вариантов. Ну в основном использовался первый вариант.

Я помню классный был тип строки в Паскале. Он хранил длину в байте. И строки не могли быть длине 255.

А вот где данные хранились - в самом типе или в динамике я не помню.
...
Рейтинг: 0 / 0
папка это файл?
    #39997187
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Точно. 255. В информатике и выч-технике 20-го века это число - магическое.
Во многих приложениях и сетевых протоколах это число заложено как лимит.
...
Рейтинг: 0 / 0
папка это файл?
    #39997210
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
А вот где данные хранились - в самом типе или в динамике я не помню.
Байтовый массив. Позиция ноль - фактическая длина строки, дальше - собственно строка. В этом смысле - "в самом типе".
...
Рейтинг: 0 / 0
папка это файл?
    #39997213
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу сорцов du (DiskUsage) я нашел один вариант здесь

В составе GNU Core Utilities
https://github.com/coreutils/coreutils
...
Рейтинг: 0 / 0
папка это файл?
    #39997231
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо на практике, подобные пробирующие алгоритмы не работают потому что память нужна срочно
и многим работающим потокам.

Так вопрос-то стоит не "кому нужна память", а "зачем нужна память". В попытке ответа на
него обычно вылазит "вектор на миллиард".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997250
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
disclaimer:
* код написан на коленке и не претендует на звание best code ever
* 100% содержит ряд багов (и я даже знаю где), но, в целом, показывает подход и пригоден для исследования производительности, и последующего устранения узких мест, т.е. служит некой отправной точкой для желающих заморочится
* не поддерживает точки монтирования/hardlinks в каталогах
* не будет работать правильно (без доработки напильником), если натравить на C:\windows или корневой каталог тома. В Windows есть каталоги, на которые у вас нет прав :)
* обработка ошибок удалена для краткости

h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#pragma once

#define WIN32_LEAN_AND_MEAN
#include "wtypes.h"
#include "assert.h"

#include <optional>
#include <string>
#include <memory>


cpp (портянка)
Код: 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.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
#include "test.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

static constexpr std::wstring_view DOUBLE_SLASH		= L"\\\\";
static constexpr std::wstring_view LOCAL_PATH_PREFIX	= L"\\\\?\\";
static constexpr std::wstring_view UNC_PATH_PREFIX	= L"\\\\?\\unc";
static constexpr std::wstring_view UNC_SLASHED		= L"unc\\";

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

namespace detail {

struct ff_handle_deleter
{
	using pointer = HANDLE;
	void operator()(pointer h) { ::FindClose(h); }
};

using ff_handle = std::unique_ptr<HANDLE, ff_handle_deleter>;

} // namespace detail

namespace utils {

bool is_directory_exist(const std::wstring& strPathToCheck) noexcept
{
	assert(strPathToCheck.empty() == false);
	if (strPathToCheck.empty() == false)
	{
		auto dwAttr = ::GetFileAttributesW(strPathToCheck.c_str());
		if (dwAttr != INVALID_FILE_ATTRIBUTES)
			return (dwAttr & FILE_ATTRIBUTE_DIRECTORY);
	}
	else
		::SetLastError(ERROR_BAD_PATHNAME);

	return false;
}

bool is_path_prefixed(const std::wstring& strPathToCheck) noexcept
{
	assert(strPathToCheck.empty() == false);

	constexpr auto szCompLen = LOCAL_PATH_PREFIX.size();
	return	strPathToCheck.size() >= szCompLen &&
			strPathToCheck.compare(0, szCompLen, LOCAL_PATH_PREFIX, 0, szCompLen) == 0;
}

bool is_path_unc(const std::wstring& strPathToCheck) noexcept
{
	if (is_path_prefixed(strPathToCheck))
		return ::_wcsnicmp(strPathToCheck.c_str() + 4, UNC_SLASHED.data(), UNC_SLASHED.size()) == 0;

	return	strPathToCheck.size() >= DOUBLE_SLASH.size() &&
			::wcsncmp(strPathToCheck.c_str(), DOUBLE_SLASH.data(), DOUBLE_SLASH.size()) == 0;
}

std::wstring path_add_prefix(const std::wstring& strPathToExpand)
{
	assert(strPathToExpand.empty() == false);
	if (strPathToExpand.empty() == false)
	{
		if (is_path_prefixed(strPathToExpand) == false)
		{
			if (is_path_unc(strPathToExpand))
				return std::move(std::wstring(UNC_PATH_PREFIX).append(strPathToExpand.c_str() + 1));
			
			return std::move(std::wstring(LOCAL_PATH_PREFIX).append(strPathToExpand));
		}
		return strPathToExpand;
	}
	::SetLastError(ERROR_BAD_PATHNAME);
	return {};
}

std::wstring findfile_path_builder(const std::wstring& strDirPath, const std::wstring& strSubDir, const std::wstring& strExtension)
{
	assert(strDirPath.empty() == false);
	if (strDirPath.empty())
	{
		::SetLastError(ERROR_BAD_PATHNAME);
		return {};
	}

	size_t offset = 0;
	std::wstring_view svPrefix = L"";

	if (is_path_prefixed(strDirPath) == false)
	{
		if (is_path_unc(strDirPath))
		{
			svPrefix = UNC_PATH_PREFIX;
			offset++;
		}
		else
			svPrefix = LOCAL_PATH_PREFIX;
	}

	std::wstring strMask = strSubDir.empty() ? L"*" : L"\\*";

	if (strExtension.empty() == false)
		strMask.append(strSubDir.empty() ? L"*." : L"\\*.").append(strExtension);

	if (strDirPath.back() == L'\\')
		return std::move(std::wstring(svPrefix).append(strDirPath.c_str() + offset).append(strSubDir).append(strMask));

	return std::move(std::wstring(svPrefix).append(strDirPath.c_str() + offset).append(L"\\").append(strSubDir).append(strMask));
}

} // namespace utils

std::optional<size_t> calc_directory_size(const std::wstring& strRootDir, const std::wstring& strSubDir)
{
	if (utils::is_directory_exist(strRootDir) == false)
		return {};

	size_t result = 0;
	auto strFindPath = utils::findfile_path_builder(strRootDir, strSubDir, std::wstring{});

	WIN32_FIND_DATAW wfd = {0};
	detail::ff_handle hFind(::FindFirstFileExW(strFindPath.c_str(),
							FindExInfoBasic,
							&wfd,
							FindExSearchNameMatch,
							nullptr,
							FIND_FIRST_EX_CASE_SENSITIVE|FIND_FIRST_EX_LARGE_FETCH));

	if (hFind && ::FindNextFileW(hFind.get(), &wfd))	// каталоги [.] + [..]
	{
		strFindPath.resize(strFindPath.rfind(L'\\'));

		while (::FindNextFileW(hFind.get(), &wfd))
		{
			if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				if (wfd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
					continue;

				auto calcedSize = calc_directory_size(strFindPath, wfd.cFileName);
				if (calcedSize.has_value() == false)
				{
//					auto err = ::GetLastError();
					return {};
				}
				result += calcedSize.value();
			}
			else
			{
				ULARGE_INTEGER nFileSize = { wfd.nFileSizeLow, wfd.nFileSizeHigh };
				result += nFileSize.QuadPart;
			}
		}
	}
	
	if (::GetLastError() == ERROR_NO_MORE_FILES)
		return result;
	
//	auto err = ::GetLastError();
	return {};
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


int APIENTRY wWinMain([[maybe_unused]] HINSTANCE h, [[maybe_unused]] HINSTANCE, [[maybe_unused]] LPWSTR lpCmdLine, [[maybe_unused]] int nShowCmd)
{
	auto s = calc_directory_size(L"d:\\your_big_folder", L"");
	if (s.has_value() == false)
		return ::GetLastError();

	return s.value();
}


Диагностику снял с локального каталога на SSD, в первую очередь чтобы показать, что основная масса рассчетов/задержек приходится на kernel функцию FindFirstFile, а не на промахи кэша (но они безусловно есть, но их устранение - это экономия на спичках, имхо)

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

А в вижуалах проект должен иметь еще один файлик... эээ. Build-file? Или какой-то make-file?
...
Рейтинг: 0 / 0
папка это файл?
    #39997253
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А в вижуалах проект должен иметь еще один файлик... эээ. Build-file? Или какой-то make-file?

достаточно просто создать пустой Win32 проект и прикрепить к нему эти файлы.
в cpp есть функция main, ее код можно уже писать как вам удобно, я привел ее для только как образец

выставить в настройках только не забудьте компиляцию с поддержкой C++17 (у меня VS2019)
...
Рейтинг: 0 / 0
папка это файл?
    #39997300
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
анализ этим же кодом более объемного каталога по сети (SMB/SSD/Windows Server 2019/LAN1Gb)

в каталоге: 78 Files, 312 237 Folders
объем: 465 MB (487 739 392 bytes)

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

Судя по профилю, одно только убирание избыточной проверки на существование из calc_directory_size() сократит время на четверть.

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     if (utils::is_directory_exist(strRootDir) == false)
		return {};

	size_t result = 0;
	auto strFindPath = utils::findfile_path_builder(strRootDir, strSubDir, std::wstring{});

	WIN32_FIND_DATAW wfd = {0};
     	detail::ff_handle hFind(::FindFirstFileExW(strFindPath.c_str(),
...
Рейтинг: 0 / 0
папка это файл?
    #39997318
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
убирание избыточной проверки на существование из calc_directory_size() сократит время на четверть.

попробуем

по субъективным ощущениям (замерить мне их нечем)
Total Commander анализирует этот же каталог примерно за то же самое время как и мой код
Проводник делает это раза в 3 быстрее плюс / минус

Представьте что у вас облачный сервис, в котором клиент хранит свои данные, а ля OneDrive. Он заходит в личный кабинет, где у него должен отобразиться объем занятого его файлами места. Сайт отправляет команду вашей службе и та начинает пилить его диск в течение 3-4 минут!


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

с которой я обращаюсь на удаленку или удаленку?

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

Я имею в виду что серия экспериментов будет иметь визуальный вид улучшения результатов.
Что само по себе - фейк. В продуктовой задаче иногда бывает важен самый первый запуск
джоба. И его измерения будут эталоном.
...
Рейтинг: 0 / 0
папка это файл?
    #39997323
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Непонятно зачем нам проверять что директория существует? Хм. Как-то избыточно. Следующая-же транзакция
пойдет по следам и все равно проверит. Это как проверять что в БД таблица существует перед чтением.

с этим никто не спорит, но

представим что у нас первая итерация вызова calc_directory_size и указанный каталог не существует, получается что вместо этой проверки достанется по мозгам менеджеру памяти, который будет вынужен сначала построить нам правильную строку для FindFirstFile в utils::findfile_path_builder. То есть вся эта работа будет проведена в пустую, а если принять во внимание, что таких запросов ваша служба может получить сразу несколько или параллельно выполнять что-то тяжелое с памятью, то такое дерганиье менеджера памяти автоматически тормозит на аллокации все потоки в службе. Context Switching однако

Понятно, что надо оценить что более трудозатратно с точки зрения ОС: дернуть память пару раз или один раз сходить проверить существует ли каталог по сети.

Как уже ответил, я попробую убрать данную проверку и повторить замеры
...
Рейтинг: 0 / 0
папка это файл?
    #39997326
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
На той на которой ты делаешь дисковые операции. Я думаю что NTFS - умная система. И она - минимизирует
физические чтения областей каталогов. И этот механизм можно сбить либо размонтированием тома. И снова
монтированием. Что болезненно. И опасно. Либо перезагрузкой. Что проще.

перезагружу, не вопрос.

просто я без перезагрузки попробовал после себя Total Commdander'ом и ему это не особо помогло что данные горячие. Я думаю, что это более актуальнее для локальный операций, дисковый кэш, а тут у нас имеется посредник в виде SMB и исполнитель команды не знает что там, на той стороне за ФС, поэтому, ему тяжелее делать какие-то кэш оптимизации дисковых операций.

но перезагрузить попробую.
Собственно первый мой замер по сети был на холодную
...
Рейтинг: 0 / 0
папка это файл?
    #39997327
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Что болезненно. И опасно. Либо перезагрузкой. Что проще.
Ню-ню
Код: plaintext
1.
2.
3.
4.
Microsoft DiskPart version 6.1.7601
...
ONLINE      - Online an object that is currently marked as offline.
OFFLINE     - Offline an object that is currently marked as online.
...
...
Рейтинг: 0 / 0
папка это файл?
    #39997328
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(Разводя руками)

На современных ноутах Windows часто стоит 1 системный
раздел. Вот я и исхожу из такого Пареттовского предположения.
...
Рейтинг: 0 / 0
папка это файл?
    #39997335
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
предположения
"Предположение - мать всех провалов"
Код: plaintext
1.
2.
3.
4.
5.
6.
...
    Reduces the size of the volume with focus by the specified amount. Makes
    free disk space available from unused space at the end of the volume.

Syntax:  SHRINK [DESIRED=<N>] [MINIMUM=<N>] [NOWAIT] [NOERR]
        SHRINK QUERYMAX [NOERR]
...
...
Рейтинг: 0 / 0
папка это файл?
    #39997336
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
убирание избыточной проверки на существование из calc_directory_size() сократит время на четверть.

убрал проверку, файловый сервер перезагружен
...
Рейтинг: 0 / 0
папка это файл?
    #39997339
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, зачем нам SHRINK? Он нам в топике ненужен.
...
Рейтинг: 0 / 0
папка это файл?
    #39997340
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumубрал проверку

Не четверть, но тоже неплохо. Теперь надо переводить на итерации и пробовать параллельное
чтение.
Вариантов два:
1) Каждый FindFirst/Next создаёт отдельный round-trip на сервер, параллельное чтение будет
рулить со страшной силой;
2) Результаты сканирования передаются по SMB пачками, параллельное чтение ухудшит ситуацию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997341
Cerebrum
За это время, сколько раз клиент, подумав что браузер завис, начнет эту операцию заново?
Короче весело...

а если он просто F5 зажмёт? Вам в другую сторону копать надо бы )
...
Рейтинг: 0 / 0
папка это файл?
    #39997343
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum, нам нужны выводы. Стало меньше. Что повлияло. Убирание exist? ИЛи ребут.
Нужно еще хотя-бы 2 измерения чтоб устаканить величину.
...
Рейтинг: 0 / 0
папка это файл?
    #39997344
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum

представим что у нас первая итерация вызова calc_directory_size и указанный каталог не существует, получается что вместо этой проверки достанется по мозгам менеджеру памяти, который будет вынужен сначала построить нам правильную строку для FindFirstFile в utils::findfile_path_builder. То есть вся эта работа будет проведена в пустую, а если принять во внимание, что таких запросов ваша служба может получить сразу несколько или параллельно выполнять что-то тяжелое с памятью, то такое дерганиье менеджера памяти автоматически тормозит на аллокации все потоки в службе.

Предлагаю отказаться от динамической памяти при построении пути к файлам. Вам хватит одного массива "char[64 кбайт]".
...
Рейтинг: 0 / 0
папка это файл?
    #39997346
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Он нам в топике ненужен
А кто вам это сказал?
Хотя, с другой стороны, если отдельный том вам не нравится, то существует виртуальный диск, который легко создать и перемонтировать с гарантированным сбросом кэша.
...
Рейтинг: 0 / 0
папка это файл?
    #39997351
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Cerebrum, нам нужны выводы. Стало меньше. Что повлияло. Убирание exist? ИЛи ребут.
Нужно еще хотя-бы 2 измерения чтоб устаканить величину.

все написал.
повлияло удаление проверки как и предлогали
перезагрузка сервера выполнена

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

Пока в топе функций не светятся new/delete этим можно не заморачиваться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997354
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
mayton
Он нам в топике ненужен
А кто вам это сказал?
Хотя, с другой стороны, если отдельный том вам не нравится, то существует виртуальный диск, который легко создать и перемонтировать с гарантированным сбросом кэша.

Вася яж не спорю. Можно.

Просто я предлагаю эксперимент который любой может провести на ноуте. А ты предлагаешь
эксперимент которые требует предусловия которые не у всех есть. Требует наличия свободного
места. Требует выполнения админских действий которые не все хотят делать. Да и я не советую.
Просто последствия от ошибочных действий с диском - очень печальные. И иногда не восстанавливаются.

И я в топике не беру ответсвенность за такое. Хочешь - дирижируй шринком. Дай всем инструкции. Я не хочу.
...
Рейтинг: 0 / 0
папка это файл?
    #39997356
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,

Кстати, а зачем вы вообще в "utils::findfile_path_builder" строите полный путь к файлу? Не эффективнее ли будет менять текущий каталог? Ведь вы же заставляете ОС каждый раз пройтись по полному пути от корня.

Или поскольку это многопользовательский сервис, то делать этого нельзя?
...
Рейтинг: 0 / 0
папка это файл?
    #39997358
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Вам хватит одного массива "char[64 кбайт]".

как вариант, но пока мест выделения памяти довольно много и придется много где поменять логику, что скажется отрицательно, с точки зрения читабельности кода
но с производительностью всегда так, либо код понятный и медленный, либо черт ногу сломит и все более быстро
...
Рейтинг: 0 / 0
папка это файл?
    #39997359
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Пока в топе функций не светятся new/delete этим можно не заморачиваться.

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

petravПредлагаю отказаться от динамической памяти при построении пути к файлам

Пока в топе функций не светятся new/delete этим можно не заморачиваться.

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

petravПредлагаю отказаться от динамической памяти при построении пути к файлам

Пока в топе функций не светятся new/delete этим можно не заморачиваться.

Судя по профилировщику мы долго ожидаем функцию FindFirst. Это получение итератора
на список файлов в каталоге NTFS.
...
Рейтинг: 0 / 0
папка это файл?
    #39997364
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Кстати, а зачем вы вообще в "utils::findfile_path_builder" строите полный путь к файлу?

это требование FindFirstFile, ей нужна маска, а не просто путь, тк она вся из себя гибкая и универсальная.
Когда я строю путь, по нему от корня никто не проходит, выполняется лишь декорирование пути под маску.

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

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

все верно, данная ф-ция устроена в Windows так, что она делает упреждающее чтение всегда, то есть всегда забивает некий кэш списком файлов, чтобы десять раз не бегать. Именно об этом и говорят оптимизирующий флаги, которые я использовал в Ex версии. Условно я разрешил ОС использовать больше память под кэш упреждающего чтения
...
Рейтинг: 0 / 0
папка это файл?
    #39997369
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravНе эффективнее ли будет менять текущий каталог?

Сугубо без разницы. Но побочные эффекты злее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997374
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСудя по профилировщику мы долго ожидаем функцию FindFirst. Это получение итератора
на список файлов в каталоге NTFS.

Если учесть, что NTFS построена в виде B-tree, этот итератор нетривиален, как и его получение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997375
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мы дерево каталогов разрежем на уровень 1 и все остальные 2,3,4,...e.t.c
то у нас получается ключ группы и его значения.

Дальше - можно попробовать map-reduce на этом дереве. Но хотя-бы в 2 потока.
Почему в 2 потока? Ну... диск и так нагружен. Можем только выиграть на процессорных
операциях которые делают всякую логику типа там хождения по структуре B-дерева
каталога и проверку ACL.

Ведь формула подсчета size директорий идеально ложиться на шаблон map-reduce.

Ну что господа сишники? Осилим мы такой подход?
...
Рейтинг: 0 / 0
папка это файл?
    #39997376
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,

>но с производительностью всегда так, либо код понятный и медленный, либо черт ногу сломит и все более быстро
== да))
Смотря что надо _прикладному коду_ выше уровнем.
...
Рейтинг: 0 / 0
папка это файл?
    #39997378
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravНе эффективнее ли будет менять текущий каталог?

Сугубо без разницы. Но побочные эффекты злее.

Но почему? Смотрите: мы в FindFirst() передаём полный путь и эта фигня бежит по всему дереву, по каждой подпапке, проверяет существование и права доступа.

А если мы изменим текущий каталог, то мы работаем в текущей песочнице. Плюс динамические строки отваливаются вообще элементарно.

Сотни тысяч операций не выполняются.
...
Рейтинг: 0 / 0
папка это файл?
    #39997383
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravА если мы изменим текущий каталог, то мы работаем в текущей песочнице.

Система, получив относительный путь в FindFirst, переводит его в абсолютный и задача
сводится к той, что выше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997385
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Система, получив относительный путь в FindFirst, переводит его в абсолютный и задача сводится к той, что выше.
Система может выполнить эту задачу эффективнее прикладного кода.
Разумно поручить системе всё, что упрощает прикладной код, пока это укладывается в требования эффективности?
...
Рейтинг: 0 / 0
папка это файл?
    #39997387
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravА если мы изменим текущий каталог, то мы работаем в текущей песочнице.

Система, получив относительный путь в FindFirst, переводит его в абсолютный и задача
сводится к той, что выше.

Почему вы так решили? Мне кажется это было бы бессмысленным.
...
Рейтинг: 0 / 0
папка это файл?
    #39997398
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum
...
В целом, если сравнивать мою наивную реализацию на FindFirst/FindNextFile и ту реализацию, которая используется в Explorer'e (открыть каталог, правой кнопкой мыши, посмотреть свойства), то создается впечатление, что Проводник не использует FindFirst/NextFile API, либо использует их как-то очень хитро, потому что производительность его рассчетов значительно превышает производительность указанных функций в моей реализации (проводил как-то анализ на "холодных" данных/кэше).
...
dir из cmd.exe быстро работает?

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

потому что это написано в документации работы относительных путей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997410
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и дополнительно на это намекает
MSDNIf the string ends with a wildcard, period (.), or directory name, the user
must have access permissions to the root and all subdirectories on the path.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997468
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravПочему вы так решили?

потому что это написано в документации работы относительных путей.

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

Так почему бы не спросить у гугля? Он честно выдаёт
https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#path-normalization
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #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
папка это файл?
    #39997823
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81это ж в каком состоянии надо быть чтобы так опечататься ?

Да, в общем-то, в типичном для тех времён. "На весь мир требуется не более полудюжины
компьютеров."


хочешь сказать там опечатка ?

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

Я хочу сказать, что этот код был способен работать на единственной версии единственной
операционки, установленной на единственном компьютере.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
папка это файл?
    #39997835
а как тогда этот код попал в 2020?

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

на обычных папках всё верно, а вот на папках типа Windows и Program Files получается неверно...
га*нокод мой таков :

Код: 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.
#define _CRT_SECURE_NO_WARNINGS 1
#define MAX_PATH_LENGTH  64*1024
#define MAX_CURRENT_FOLDER_LENGTH  1024
#include "windows.h"
#include <stdio.h>

char dir[MAX_PATH_LENGTH] = "";
int fileQty = 0;
long long folderSize = 0;

void walkDir(char *Dir, int deep){
    char currentDirName[MAX_CURRENT_FOLDER_LENGTH] = "";
    int cutX = 0;
    int folder_is_end = 555; //если дошли до конца , то 0, а сначала не дошли (555)
    if (strlen(dir)==0) strcpy(dir, Dir);
    strcat(dir, "*");
    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
    hf = FindFirstFileA(dir, &FindFileData);
    if (hf != INVALID_HANDLE_VALUE) {
        while (folder_is_end != 0) {
            while ((folder_is_end = FindNextFileA(hf, &FindFileData)) != 0) {
                if (strcmp(FindFileData.cFileName, ".") == 0 || strcmp(FindFileData.cFileName, "..") == 0) continue;
                if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) break;
                //printf("%s \n", FindFileData.cFileName);
                fileQty++;
                folderSize = folderSize + FindFileData.nFileSizeLow;
            }
            if (folder_is_end != 0) {
                dir[strlen(dir) - 1] = '\0'; //убираем звездочку справа
                strcpy(currentDirName, FindFileData.cFileName);
                strcat(dir, currentDirName);
                strcat(dir, "/");
                walkDir(dir,deep+1);
                dir[strlen(dir) - 1] = '\0'; //убираем звездочку справа
                dir[strlen(dir) - 1] = '\0'; //и слеш
                cutX = strlen(dir) - strlen(currentDirName) ;
                dir[cutX] = '\0'; 
                strcat(dir, "*");
            }
        }
    } 
 }

int main(int argc, char* argv[]){
    walkDir("C:/windows/",0);
    printf("Number of files: %d\n", fileQty);
    printf("Total size: %d\n", folderSize);
}
...
Рейтинг: 0 / 0
папка это файл?
    #40002821
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
закрывай!
...
Рейтинг: 0 / 0
230 сообщений из 230, показаны все 10 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / папка это файл?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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