Альтернатива команде dir для запроса каталога в C - PullRequest
0 голосов
/ 16 февраля 2020

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

Я пытался использовать opendir() файла заголовка dirent.h, но вскоре понял, что он не использует концепцию регулярных выражений.

Команда dir, которую я пытаюсь эмулировать:

dir [regex] /b

Мне нужен вывод в (char) буфере **. Конвейер вывода может быть решением, но я ищу более эффективный способ сделать это.

Существует ли какая-либо предопределенная функция в стандартной библиотеке (C90) или нам придется создавать собственную реализацию?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

C не знает о каталогах . Это операционная система спецификация c, обычно предоставляемая вашим ядром ОС (однако посмотрите внутри GNU Hurd как исключение и в unikernels ). Прочитайте C11 стандарт n1570 и забудьте в 2020 году об устаревших стандартах C89 и Turbo C. Попробуйте попробовать Linux дистрибутив (например, Ubuntu или Debian или другие). Большинство из них предоставляют G CC или Clang (или не оптимизирующий Tiny CC компилятор) и являются очень разработчиками -дружелюбный. Моя рекомендация: используйте G CC как gcc -Wall -Wextra -g. Выберите достаточно хороший встроенный инструмент автоматизации (может быть GNU make ) с соответствующим редактором исходного кода (например, GNU emacs или vim или geany или другие). Узнайте, , как отлаживать небольшие программы и использовать отладчик GDB и инструмент управления версиями git.

POSIX знает о каталогах (это спецификация API , написанная на английском языке sh, также определяющая regex (3) ). См. здесь и прочитайте Linux справочные страницы . А также WinAPI .

Вкл. Linux, см. mkdir (2) , chdir (2) , readdir ( 3) , getcwd (3) , unlink (2) , stat (2) , open (2) , nftw (3) , path_resolution (7) et c и т. Д .; Вы можете изучить исходный код Linux ядра и некоторых распространенных библиотек C для него, таких как GNU glib c или musl- Lib c. Бюджет на это несколько месяцев полный рабочий день ваших усилий. Они с открытым исходным кодом , поэтому при некоторых условиях вам разрешается изучать, улучшать и повторно использовать их исходный код . См. Также http://linuxfromscratch.org/

Обратите внимание также popen . Вы, вероятно, не хотите его использовать и предпочли бы использовать более примитивные системные вызовы (см. syscalls (2) для их списка в Linux). Вы можете использовать такую ​​библиотеку, как Glib (из GTK ).

Помните, что C программы (типа отдельно ) могут работать на голом металле (например, Arduino ). В этих случаях говорить о каталогах не имеет никакого смысла. Смотрите также osdev.org и обратите внимание, что Linux ядро ​​ записано в C (с небольшим количеством ассемблерного кода).

GrassHopper была ОС, написанной в основном на C без каких-либо файлов или каталогов. Смотрите также старые обсуждения, заархивированные на tunes.org и tccboot .

0 голосов
/ 23 февраля 2020

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

Подробнее см. В документации Turbo C. .

...