java.nio.file.Files.walkFileTree
我有一些与该接口一起使用的现有 Java 代码FileVisitor
,但现在我需要将其移植到纯 C。是否有与该接口等效的 C 语言?如果没有,我可以使用哪些原语来构建一个?
我查看了 Unixftw
和nftw
函数,但似乎它们不会起作用,因为回调函数没有用于提供用户变量的参数(单个 void* 参数会很好)。我的代码需要是线程安全的。
java.nio.file.Files.walkFileTree
我有一些与该接口一起使用的现有 Java 代码FileVisitor
,但现在我需要将其移植到纯 C。是否有与该接口等效的 C 语言?如果没有,我可以使用哪些原语来构建一个?
我查看了 Unixftw
和nftw
函数,但似乎它们不会起作用,因为回调函数没有用于提供用户变量的参数(单个 void* 参数会很好)。我的代码需要是线程安全的。
我已经需要为我的一个项目进行文件遍历。我还需要它在 Linux 和 Windows 上是可移植的。
我没有找到它的开源实现,最后我自己实现了它。这终于不是太多的工作。
在 Linux 端,我使用opendir()
andreaddir()
来迭代目录条目。
在 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
,您应该能够将其粘贴到您的程序中,最多只需稍作修改。您还需要 header fts.h
。
如果在 c++ 中混合是可以接受的,那么这样做有一些提升,但从未使用过它。