65

Cでフォルダーとファイルのディレクトリをどのようにスキャンしますか? クロスプラットフォームである必要があります。

4

9 に答える 9

84

次の POSIX プログラムは、現在のディレクトリにあるファイルの名前を出力します。

#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int main (void)
{
  DIR *dp;
  struct dirent *ep;     
  dp = opendir ("./");

  if (dp != NULL)
  {
    while (ep = readdir (dp))
      puts (ep->d_name);

    (void) closedir (dp);
  }
  else
    perror ("Couldn't open the directory");

  return 0;
}

クレジット: http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html

Ubuntu 16.04 でテスト済み。

于 2008-08-15T17:27:32.307 に答える
22

厳密な答えは「できません」です。フォルダーの概念そのものが真のクロスプラットフォームではないためです。

MS プラットフォームでは、_findfirst、_findnext、_findclose を 'c' のような感じに使用でき、FindFirstFile と FindNextFile を基礎となる Win32 呼び出しに使用できます。

C-FAQ の回答は次のとおりです。

http://c-faq.com/osdep/readdir.html

于 2008-08-15T17:27:42.383 に答える
19

この問題に対処するオープンソース(BSD)Cヘッダーを作成しました。現在、POSIXとWindowsをサポートしています。チェックアウトしてください:

https://github.com/cxong/tinydir

tinydir_dir dir;
tinydir_open(&dir, "/path/to/dir");

while (dir.has_next)
{
    tinydir_file file;
    tinydir_readfile(&dir, &file);

    printf("%s", file.name);
    if (file.is_dir)
    {
        printf("/");
    }
    printf("\n");

    tinydir_next(&dir);
}

tinydir_close(&dir);
于 2013-02-04T00:52:29.670 に答える
11

ディレクトリ内のファイルを列挙する標準的な C (または C++) の方法はありません。

Windows では、FindFirstFile/FindNextFile 関数を使用して、ディレクトリ内のすべてのエントリを列挙できます。Linux/OSX では、opendir/readdir/closedir 関数を使用します。

于 2008-08-15T17:29:29.557 に答える
8

GLibは、GTK+グラフィカルツールキットの基礎を形成するCの移植性/ユーティリティライブラリです。スタンドアロンライブラリとして使用できます。

ディレクトリを管理するためのポータブルラッパーが含まれています。詳細については、 Glibファイルユーティリティのドキュメントを参照してください。

個人的には、GLibのようなものがなければ、大量のCコードを書くことすら考えません。移植性は1つですが、データ構造、スレッドヘルパー、イベント、メインループなどを無料で入手できるのも便利です。

Jikes、私はほとんどセールスマンのように聞こえ始めています:)(心配しないでください、glibはオープンソース(LGPL)であり、私はそれとはまったく関係がありません)

于 2008-09-17T20:18:26.230 に答える
6

opendir/readdir は POSIX です。実現したい移植性に対して POSIX では不十分な場合は、Apache Portable Runtimeを確認してください。

于 2008-08-15T17:26:02.387 に答える
2

に最もよく似た方法readdirは、おそらくほとんど知られていない_find関数のファミリーを使用することです。

于 2011-07-24T07:42:21.093 に答える
2

ディレクトリのリストは、検討中の OS/プラットフォームによって大きく異なります。これは、さまざまなオペレーティング システムが独自の内部システム コールを使用してこれを実現しているためです。

この問題の解決策は、この問題を隠して移植可能なライブラリを探すことです。残念ながら、すべてのプラットフォームで問題なく動作するソリューションはありません。

POSIX 互換システムでは、ライブラリを使用して、Clayton によって投稿されたコードを使用してこれを実現できます (これは、元は W. Richard Stevens による UNIX の高度なプログラミングの本から参照されています)。このソリューションは *NIX システムで機能し、Cygwin がインストールされている場合は Windows でも機能します。

または、基盤となる OS を検出するコードを記述し、その OS の下のディレクトリ構造をリストする「適切な」方法を保持する適切なディレクトリ リスト関数を呼び出すこともできます。

于 2008-08-15T20:20:24.267 に答える