1

java.nio.file.Files.walkFileTree我有一些与该接口一起使用的现有 Java 代码FileVisitor,但现在我需要将其移植到纯 C。是否有与该接口等效的 C 语言?如果没有,我可以使用哪些原语来构建一个?

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

4

3 回答 3

1

我已经需要为我的一个项目进行文件遍历。我还需要它在 Linux 和 Windows 上是可移植的。

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

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

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

于 2013-01-10T10:54:46.420 回答
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 版本fts.c,您应该能够将其粘贴到您的程序中,最多只需稍作修改。您还需要 header fts.h

于 2013-01-10T11:16:50.557 回答
-1

如果在 c++ 中混合是可以接受的,那么这样做有一些提升,但从未使用过它。

于 2013-01-10T11:10:10.507 回答