Cでフォルダーとファイルのディレクトリをどのようにスキャンしますか? クロスプラットフォームである必要があります。
9 に答える
次の 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 でテスト済み。
厳密な答えは「できません」です。フォルダーの概念そのものが真のクロスプラットフォームではないためです。
MS プラットフォームでは、_findfirst、_findnext、_findclose を 'c' のような感じに使用でき、FindFirstFile と FindNextFile を基礎となる Win32 呼び出しに使用できます。
C-FAQ の回答は次のとおりです。
この問題に対処するオープンソース(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);
ディレクトリ内のファイルを列挙する標準的な C (または C++) の方法はありません。
Windows では、FindFirstFile/FindNextFile 関数を使用して、ディレクトリ内のすべてのエントリを列挙できます。Linux/OSX では、opendir/readdir/closedir 関数を使用します。
GLibは、GTK+グラフィカルツールキットの基礎を形成するCの移植性/ユーティリティライブラリです。スタンドアロンライブラリとして使用できます。
ディレクトリを管理するためのポータブルラッパーが含まれています。詳細については、 Glibファイルユーティリティのドキュメントを参照してください。
個人的には、GLibのようなものがなければ、大量のCコードを書くことすら考えません。移植性は1つですが、データ構造、スレッドヘルパー、イベント、メインループなどを無料で入手できるのも便利です。
Jikes、私はほとんどセールスマンのように聞こえ始めています:)(心配しないでください、glibはオープンソース(LGPL)であり、私はそれとはまったく関係がありません)
opendir/readdir は POSIX です。実現したい移植性に対して POSIX では不十分な場合は、Apache Portable Runtimeを確認してください。
に最もよく似た方法readdir
は、おそらくほとんど知られていない_find
関数のファミリーを使用することです。
ディレクトリのリストは、検討中の OS/プラットフォームによって大きく異なります。これは、さまざまなオペレーティング システムが独自の内部システム コールを使用してこれを実現しているためです。
この問題の解決策は、この問題を隠して移植可能なライブラリを探すことです。残念ながら、すべてのプラットフォームで問題なく動作するソリューションはありません。
POSIX 互換システムでは、ライブラリを使用して、Clayton によって投稿されたコードを使用してこれを実現できます (これは、元は W. Richard Stevens による UNIX の高度なプログラミングの本から参照されています)。このソリューションは *NIX システムで機能し、Cygwin がインストールされている場合は Windows でも機能します。
または、基盤となる OS を検出するコードを記述し、その OS の下のディレクトリ構造をリストする「適切な」方法を保持する適切なディレクトリ リスト関数を呼び出すこともできます。