1

java.nio.file.Files.walkFileTreeインターフェイスで使用する既存のJavaコードがいくつかありFileVisitorますが、プレーンCに移植する必要があります。このインターフェイスに相当するCはありますか?そうでない場合、どのプリミティブを使用してビルドできますか?

Unixftwnftw関数を見てきましたが、コールバック関数にはユーザー変数を提供するためのパラメーターがないため、それらが機能するようには見えません(単一のvoid *パラメーターがあれば良かったでしょう)。私のコードはスレッドセーフである必要があります。

4

3 に答える 3

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)

お使いの OS に が含まれていない場合は、 OpenBSD バージョンの をfts(3)チェックしてください。これは、わずかな変更でプログラムに貼り付けることができるはずです。header も必要です。fts.cfts.h

于 2013-01-10T11:16:50.557 に答える
1

私のプロジェクトの 1 つで、ファイル ウォーキングが必要でした。また、Linux と Windows で移植できるようにする必要もありました。

オープンソースの実装が見つからず、最終的に自分で実装することになりました。これは最終的には大した作業ではありませんでした。

Linux 側では、 と を使用opendir()readdir()てディレクトリ エントリを繰り返し処理しました。
Windows 側では、仕事をするためにFindFirstFileA()とを使用しました。 次に、エントリごとに、使用済みの定義済みコールバックを呼び出すだけです。FindNextFileA()

どちらの実装も 100 行を超えるコードは必要ありません。そのため、DIY をお勧めします。

于 2013-01-10T10:54:46.420 に答える
-1

C ++でのミキシングが許容できる場合は、これを行うためのブーストがありますが、使用したことはありません。

于 2013-01-10T11:10:10.507 に答える