将Java NIO Files.walkFileTree访问者移植到C,保持线程安全

时间:2013-01-10 10:38:13

标签: c filetree directory-walk

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

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

3 个答案:

答案 0 :(得分:1)

我已经对我的一个项目有了文件行走的需要。我还需要它在Linux和Windows上可移植。

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

在Linux方面,我使用opendir()readdir()来迭代目录条目 在Windows方面,我使用FindFirstFileA()FindNextFileA()来完成这项工作 对于每个条目,我只需调用已使用的已定义回调。

两种实现都不需要超过100行代码......所以我建议你DIY。

答案 1 :(得分:1)

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 version of fts.c,您应该可以将其粘贴到您的程序中,只需进行少量修改即可。您还需要标题fts.h

答案 2 :(得分:-1)

如果在c ++中混合是可以接受的,那么这样做会有所改进,但从未使用它。