В boost::filesystem для итерации по директориям предлагается использовать boost::filesystem::directory_iterator
Все хорошо, но он ищет все подряд, и я не понимаю как в него передать классическую маску поиска (типа "*.ext").
Эту маску должен вводить пользователь, поэтому регулярные выражения не годятся, нужна именно простая привычная всем маска (кстати как она правильно называется?)
Есть ли в бусте подобные решения?
Здравствуйте, x-code, Вы писали:
XC>В boost::filesystem для итерации по директориям предлагается использовать boost::filesystem::directory_iterator XC>Все хорошо, но он ищет все подряд, и я не понимаю как в него передать классическую маску поиска (типа "*.ext"). XC>Эту маску должен вводить пользователь, поэтому регулярные выражения не годятся, нужна именно простая привычная всем маска (кстати как она правильно называется?) XC>Есть ли в бусте подобные решения?
Вообще-то маска элементарно транслируется в regex:
. -> \. (точно так же \^ \[ \$ \\)
? -> .
* -> .*
этого должно быть достаточно, чтоб получить базовый регексп, то есть маска *[1].* превратится в регэксп .*\[1]\.\*
а дальше std::regex("aaa", std::regex::basic) (вместо "ааа" регэксп)
Здравствуйте, jazzer, Вы писали:
J>Вообще-то маска элементарно транслируется в regex:
Одна беда, простая маска может использоваться в ядре (через Win/Native API), и способна значительно усечь как трафик данных в юзермод, так и количество сисколлов.
Здравствуйте, IID, Вы писали:
IID>Одна беда, простая маска может использоваться в ядре (через Win/Native API), и способна значительно усечь как трафик данных в юзермод, так и количество сисколлов.
С учетом того, что в каждом шелле свои варианты синтаксиса маски, я бы очень удивился, если бы этим занималось ядро.
Но если вдруг это действительно так, то это очень интересно, поделись ссылкой, плиз.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, IID, Вы писали:
IID>>Одна беда, простая маска может использоваться в ядре (через Win/Native API), и способна значительно усечь как трафик данных в юзермод, так и количество сисколлов.
J>С учетом того, что в каждом шелле свои варианты синтаксиса маски, я бы очень удивился, если бы этим занималось ядро.
Шеллам никто не мешает приводить свои маски к системным + делать свой постпроцессинг.
Впрочем всё проще. В POSIX никто и не думал об оптимизациях. Поэтому сисколл getdents[64] не предполагает передачу ему маски, и шарашит в ответ всё подряд.
J>Но если вдруг это действительно так, то это очень интересно, поделись ссылкой, плиз.
NtQueryDirectoryFile
(Функции WIN API FindFirstFile/FindNextFile построены на её базе)
Параметр FileName
An optional pointer to a caller-allocated Unicode string containing the name of a file (or multiple files, if wildcards are used) within the directory specified by FileHandle. This parameter is optional and can be NULL.
Более того, т.к. в Win весь IO может работать в асинхронном режиме — то и перечисление каталога тоже можно сделать асинхронным. Правда до уровня WinApi эта фича не доехала, оставшись Native.