Портирование 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++ является приемлемым, то для этого есть что-то полезное, но никогда не используйте его.

Другие вопросы по тегам