移植Java NIO文件.walkFileTree访问器到C,维护线程安全



我有一些使用java.nio.file.Files.walkFileTreeFileVisitor接口的现有Java代码,但现在我需要将其移植到普通C中。如果没有,我可以使用什么原语来构建一个?

我已经看过Unix的ftwnftw函数,但它似乎不会工作,因为回调函数没有一个参数提供用户变量(一个单一的void*参数会很好)。我的代码需要是线程安全的

对于我的一个项目,我已经需要文件遍历了。我还需要它能在Linux和Windows上移植。

我没有找到它的开源实现,最后我自己实现了它。这终于不是太多的工作。

在Linux端,我使用opendir()readdir()来遍历目录条目。在Windows端,我使用FindFirstFileA()FindNextFileA()来完成工作。
接下来,对于每个条目,我只需调用一个已定义的回调。

两个实现都不超过100行代码…所以我建议你自己动手。

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);

IMHO,这比访问者模式干净得多,但是对于直接移植Java代码,当然可以在fts(3)之上实现它。

如果您的操作系统没有fts(3),那么请查看OpenBSD版本的fts.c,您应该能够将其粘贴到您的程序中,只需进行最轻微的修改。您还需要标题fts.h

如果在c++中混合是可以接受的,那么boost中有一些东西可以做到这一点,但千万不要使用它

相关内容

  • 没有找到相关文章

最新更新