我有一些现有的Java代码使用java.nio.file.Files.walkFileTree
和FileVisitor
接口,但现在我需要将它移植到普通的C.这个接口是否有C等价物?如果没有,我可以用什么原语来构建一个?
我查看了Unix ftw
和nftw
函数,但似乎它们不起作用,因为回调函数没有用于提供用户变量的参数(单个void * param会很好)。我的代码需要是线程安全的。
答案 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 ++中混合是可以接受的,那么这样做会有所改进,但从未使用它。