我有一些使用java.nio.file.Files.walkFileTree
和FileVisitor
接口的现有Java代码,但现在我需要将其移植到普通C中。如果没有,我可以使用什么原语来构建一个?
我已经看过Unix的ftw
和nftw
函数,但它似乎不会工作,因为回调函数没有一个参数提供用户变量(一个单一的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中有一些东西可以做到这一点,但千万不要使用它