Re: Поиск файлов по шаблону в *nix и Windows
От: σ  
Дата: 12.08.24 17:13
Оценка: 14 (1) +1
ЕМ>Сейчас вот приспичило, и с изумлением обнаружил, что ни в винде, ни в унихах, ни в сишной библиотеке нет функций, принимающих путь, и возвращающих тоже путь

man 3 glob
?
Отредактировано 12.08.2024 17:24 σ . Предыдущая версия .
Re: Поиск файлов по шаблону в *nix и Windows
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.08.24 22:31
Оценка: -1
Здравствуйте, Евгений Музыченко, Вы писали:

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


Вот смотри. Допустим, тебе надо обойти дерево, в котором 100500 миллионов файлов.

И допустим, у тебя крутая удобная обходилка, которая сама умеет шляться по вложенным директориям и всякое такое.

Этой обходилке, для каждого имени надо узнать, что это такое (файл, директория, символическая ссылка и т.п.), Значит, на каждое найденное имя она скажет stat() (или вендовый его налог). Тебе тоже надо знать что-то про файл, значит и ты тоже скажешь stat().

Если у тебя файлов 100500 миллионов штук, то два раза stat говорить не хотелось бы.

В Go-ной библиотеке изначально была обходилка, как ты любишь. С именами на входе и на выходе. Потом добавили такую, более си-подобную, для производительности, когда файлов шибко много. В Go-шную библиотеку просто так чего попало не добавляют. Значит, кому-то сильно приспичило.
Re: Поиск файлов по шаблону в *nix и Windows
От: пффф  
Дата: 13.08.24 10:56
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

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


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


Я много лет жил без этой "типовой" операции. Когда приспичило — написал один раз свою обёртку, и теперь много лет использую её.
Re[3]: Поиск файлов по шаблону в *nix и Windows
От: σ  
Дата: 13.08.24 20:02
Оценка: +1
σ>>Вообще, пути — вещь довольно бесполезная, т.к. это путь к TOCTOU-багам

ЕМ>То есть, glob сделали зря?


Это функция из 80-х и из Unix, который создавался в «статичные» времена

Ну ок, вряд ли glob используют в сценарии когда файлы могут создаваться/удаляться параллельно с вызовом/обработкой результата glob, так что пути здесь сойдут
Поиск файлов по шаблону в *nix и Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.08.24 16:39
Оценка:
Так как и в унихах, и в винде есть хренова гора утилит, принимающих шаблонный путь к файлу, но не поддерживающих поиска в подкаталогах, я всю жизнь искренне полагал, что существуют и соответствующие стандартные функции. Как-то так сложилось, что и findfirst, и FindFirstFile мне до сих пор приходилось использовать только для перебирания файлов в известном каталоге, а такого, чтоб на входе был готовый путь, ни разу делать не приходилось.

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

Это что ж получается — все эти утилиты сами выделяют путь из исходного шаблона, а затем комбинируют его с именами, возвращаемыми функциями поиска? Как-то странно для столь типовой операции.
Re[2]: Поиск файлов по шаблону в *nix и Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.08.24 17:57
Оценка:
Здравствуйте, σ, Вы писали:

σ>man 3 glob


То есть, до 2008 (или 2001) ее не было? Офигеть.
Re[3]: Поиск файлов по шаблону в *nix и Windows
От: σ  
Дата: 12.08.24 18:16
Оценка:
σ>>man 3 glob

ЕМ>То есть, до 2008 (или 2001) ее не было?


В драфте POSIX.2 1991-го года уже есть (http://mirror.math.princeton.edu/pub/oldlinux/Linux.old/Ref-docs/POSIX/all.pdf), в Single Unix Specification от 1994 есть (https://pubs.opengroup.org/onlinepubs/9695969499/toc.pdf)
Отредактировано 13.08.2024 8:16 σ . Предыдущая версия .
Re[2]: Поиск файлов по шаблону в *nix и Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.08.24 09:45
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Вот смотри. Допустим, тебе надо обойти дерево, в котором 100500 миллионов файлов.


Не буду смотреть — это никак не связано с заданным вопросом.
Re[2]: Поиск файлов по шаблону в *nix и Windows
От: пффф  
Дата: 13.08.24 10:55
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Этой обходилке, для каждого имени надо узнать, что это такое (файл, директория, символическая ссылка и т.п.), Значит, на каждое найденное имя она скажет stat() (или вендовый его налог). Тебе тоже надо знать что-то про файл, значит и ты тоже скажешь stat().


Pzz>Если у тебя файлов 100500 миллионов штук, то два раза stat говорить не хотелось бы.



Зачем два раза говорить stat, почему обходилка не может возвращать то, что ей вернул stat?
Re: Поиск файлов по шаблону в *nix и Windows
От: TheBeginner  
Дата: 13.08.24 11:41
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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

То, что путь полный не возвращается это очевидно — для этого той же FindFirstFile/FindNextFile пришлось бы аллокировать буфер под строку полного пути, а так возвращается только cFileName в WIN32_FIND_DATA максимальным размером MAX_PATH.
Re: Поиск файлов по шаблону в *nix и Windows
От: σ  
Дата: 13.08.24 17:58
Оценка:
ЕМ>Сейчас вот приспичило, и с изумлением обнаружил, что ни в винде, ни в унихах, ни в сишной библиотеке нет функций, принимающих путь, и возвращающих тоже путь

Вообще, пути — вещь довольно бесполезная, т.к. это путь к TOCTOU-багам
Re[2]: Поиск файлов по шаблону в *nix и Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.08.24 19:52
Оценка:
Здравствуйте, TheBeginner, Вы писали:

TB>То, что путь полный не возвращается это очевидно — для этого той же FindFirstFile/FindNextFile пришлось бы аллокировать буфер


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

Здесь речь о том, что ситуация "получить от пользователя путь с шаблонными символами в имени файла, и перебрать все подходящие под него файлы" является типичной, поскольку это стандартное поведение многих системных утилит и в унихах, и в винде, при этом обход дерева поддерживают далеко не все. Поэтому логично было бы иметь в системе готовое средство. Но даже в унихах его очень долго не было, а в винде его нет до сих пор — каждый городит свою реализацию одного и того же.
Re[2]: Поиск файлов по шаблону в *nix и Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.08.24 19:53
Оценка:
Здравствуйте, σ, Вы писали:

σ>Вообще, пути — вещь довольно бесполезная, т.к. это путь к TOCTOU-багам


То есть, glob сделали зря?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.