Портирование Java NIO Files.walkFileTree посетителя C, поддерживая безопасность потока
У меня есть существующий код Java, который использует java.nio.file.Files.walkFileTree
с FileVisitor
интерфейс, но теперь мне нужно перенести его на простой C. Есть ли эквивалент C этого интерфейса? Если нет, то какие примитивы я могу использовать для его создания?
Я смотрел на Unix ftw
а также nftw
функций, но не похоже, что они будут работать, потому что функция обратного вызова не имеет параметра для предоставления пользовательских переменных (один параметр void* был бы хорош). Мой код должен быть потокобезопасным.
3 ответа
У меня уже была потребность в файлах для одного из моих проектов. Мне также нужно, чтобы он был переносимым на Linux и Windows.
Я не нашел для него реализацию с открытым исходным кодом и, в конце концов, сам ее реализовал. Это была наконец не слишком большая работа.
На стороне Linux я использовал opendir()
а также readdir()
перебирать записи каталога.
На стороне Windows я использовал FindFirstFileA()
а также FindNextFileA()
сделать работу.
Далее для каждой записи я просто вызываю используемый определенный обратный вызов.
Обе реализации занимают не более 100 строк кода... Поэтому я бы предложил вам сделать DIY.
И операционные системы BSD, и Linux предоставляют семейство функций под названием fts(3)
, которые делают то же самое, что и POSIX ftw
но без инверсии управления с помощью обратных вызовов. Вместо этого, парадигма состоит в том, что вы "открываете" иерархию FS, чтобы получить дескриптор, а затем "читаете" записи из этого:
char *const roots[] = {root, NULL}; // fts allows for multiple roots
FTS *hier = fts_open(roots, FTS_PHYSICAL | FTS_NOSTAT, NULL);
FTSENT *entry;
while ((entry = fts_read(hier)) != NULL) {
puts(entry->fts_path);
}
fts_close(hier);
ИМХО, это намного чище, чем шаблон посетителя, но для прямого порта вашего Java-кода вы, конечно, можете реализовать это поверх fts(3)
,
Если ваша ОС не имеет fts(3)
, а затем проверить версию OpenBSD fts.c
, который вы должны быть в состоянии вставить в вашу программу с минимальными изменениями. Вам также понадобится заголовок fts.h
,
Если смешивание в C++ является приемлемым, то для этого есть что-то полезное, но никогда не используйте его.