8

私は自分のアプリケーションでglibを使用していますが、GlibにはCとの便利なラッパーがあることがわかりremoveます。ただし、これらは一度に1つのファイルまたはディレクトリでのみ機能します。unlinkrmdir

私が見る限り、C標準もglibも、再帰的なディレクトリウォーク機能を含んでいません。また、のように、ディレクトリツリー全体を一度に削除する特定の方法もわかりませんrm -rf

私がこれを行っていることについては、アクセス許可、ツリーをバックアップするシンボリックリンク(無限再帰)、または非常に単純な実装を除外するものなどの複雑さについては心配していません...したがって、私は自分自身を書くことを嫌いではありませんそのための機能。

しかし、この機能が標準ライブラリのgtkまたはglib(または他の簡単に再利用できるCライブラリ)のどこかにすでにあるのかどうか知りたいのですが、私はそれを見つけたことがありません。このトピックをグーグルで検索すると、多くの誤ったリードが生成されます。

それ以外の場合、私の計画はこのタイプのアルゴリズムを使用することです。

dir_walk(char* path, void* callback(char*) {
  if(is_dir(path) && has_entries(path)) {
    entries = get_entries(path);
    for(entry in intries) { dir_walk(entry, callback); }
  }
  else { callback(path) }
}

dir_walk("/home/user/trash", remove);

明らかに、致命的なエラーが発生するとすぐにプロセスを中止するために、いくつかのエラー処理などを組み込みます。

4

5 に答える 5

7

見たことがあり<dirent.h>ますか?AFAIKこれはPOSIX仕様に属しており、すべてではないにしてもほとんどのCコンパイラの標準ライブラリの一部である必要があります。たとえば、この<dirent.h>リファレンス(Open GroupによるシングルUNIX仕様バージョン2 )を参照してください。

PS、誰かがこれについてコメントする前に:いいえ、これは再帰的なディレクトリトラバーサルを提供しません。しかし、これは開発者が最もよく実装していると思います。要件は大きく異なる可能性があるため、万能の再帰トラバーサル機能は非常に強力である必要があります。(例:シンボリックリンクはフォローアップされていますか?再帰の深さを制限する必要がありますか?など)

于 2010-02-07T17:24:14.040 に答える
5

glib で実行したい場合は、 GFileEnumeratorを使用できます。

于 2010-02-07T17:24:52.810 に答える
5

いくつかのプラットフォームには、ftw と nftw が含まれます: 「(新しい) ファイル ツリー ウォーク」。imac のマニュアル ページを確認すると、これらはレガシーであり、新しいユーザーは fts を使用する必要があることがわかります。これらの選択のいずれかで、移植性が問題になる場合があります。

于 2010-02-07T17:32:37.567 に答える
3

標準Cライブラリは、基本的な機能を提供することを目的としています。あなたが話しているのは複合的な振る舞いです。選択したAPIにある低レベルの機能を使用して簡単に実装できます。このチュートリアルをご覧ください

于 2010-02-07T17:21:58.943 に答える
-1

remove()、unlink()、およびrmdir()について言及する「コンビニエンスラッパー」は、<glib / gstdio.h>で宣言されたものを意味すると仮定すると、実際には「コンビニエンスラッパー」ではないことに注意してください。完全に標準的な関数の前に「g_」を付けると便利なことは何ですか?(そもそも紹介した私でもそう言っていることに注意してください。)

これらのラッパーが存在する唯一の理由は、これらのラッパーが実際に実際のコードで構成されているWindowsでのファイル名の問題のためです。それらは、UTF-8でエンコードされたUnicodeのファイル名引数を取ります。対応する「ラップされていない」MicrosoftCライブラリ関数は、システムコードページでファイル名を取ります。

Windowsに移植することを目的としたコードを特に記述していない場合は、g_remove()などのラッパーを使用する理由はありません。

于 2010-02-15T10:46:31.823 に答える