2015-12-17 2 views
-1

У меня есть каталог, который содержит тысячи .txt-файлов и подпапок с еще большим количеством файлов. Мне нужно запустить программу синтаксического анализа C++, которая входит в основную папку и запускается на каждом текстовом файле, который находится в папке, и вложенных папкахЗапуск такой же программы для нескольких файлов в каталоге

Итак, как мне следует продолжить?

EDIT: Итак, вопрос, который был связан получает часть права обхода каталога, но главная проблема в том, что, как я могу «пройти каждый текстовый файл» в моей программе в каталоге

+2

'найти -name«* .txt»-exec MyProgram {} \;' –

ответ

0

Я предполагаю, что вы находитесь на Linux или какой-либо другой системе POSIX

Вы можете использовать команду find(1) (как прокомментировал Niels Keurentjes), чтобы начать другой процесс для каждого файла. Поскольку для каждого файла будет начат новый процесс, существенных ограничений не будет (но, конечно, запуск миллиона процессов займет некоторое время, даже для очень коротких жизненных процессов, вы можете потратить несколько миллисекунд времени начала - или несколько десятков их - за процесс, плюс правильное время процесса).

Если каждая обработка файлов выполняется быстро, вы можете избежать накладных расходов на запуск процесса для каждого из них. Затем вы выполните сканирование рекурсивного дерева файлов с помощью функции библиотеки nftw(3) (и дайте ей вашу функцию обработки, которая может быть очень быстрой и займет несколько микросекунд, если вы достаточно осторожны, и если обработка проста & быстро). AFAIK, он способен обрабатывать очень толстые файловые деревья.

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

BTW, обработка Толстого дерева файлов из нескольких миллионов файлов не должна быть проблемой (и должны быть сделано в течение разумного времени, через несколько минут или часов, узкое место может быть диск I/O)

PS. Смотрите также Ответы таблицу this page для приближенного времени для различных операций на некотором ПК

+0

Будет ли метод «найти» работу для 550K текстовые файлы? –

+0

Конечно, да, даже миллиард текстовых файлов, если у вас достаточно времени –

+0

Спасибо, что это сработало для меня. Для всех, кому нужно запустить программу для нескольких файлов, используйте «метод линии», как видно из комментариев, с небольшой модификацией, то есть find -name «* .txt» -exec ./myParser {} \; обратите внимание на деталь перед myParser И вам нужно будет использовать аргументы командной строки для передачи файла, который вы передаете вашему парсеру/программе –

0

Если вы не можете использовать решения типа boost в этом связанном вопросе, есть образец старомодного кода для рекурсии через структуру каталогов here.