Cのフォルダとファイルのディレクトリをどのようにスキャンしますか?それはクロスプラットフォームである必要があります。Cでディレクトリリストを取得するにはどうすればよいですか?
答えて
opendir/readdirはPOSIXです。
以下は、現在のディレクトリ内のファイルの名前を出力しますチェック厳密な答えは "できません"です。フォルダのコンセプトは本当にクロスプラットフォームではないためです。
MSプラットフォームでは、_findfirst、_findnextおよび_findcloseを使用して、 'c'種類の感触を、FindFirstFileとFindNextFileを基になるWin32呼び出しに使用できます。
ここでC-FAQの答えです:
:
#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クレジット:)POSIXは、あなたが達成したいの移植のために十分でない場合は、Apache Portable Runtime
に変更すると、_findfirst、_findnext、_findcloseの別名が既に設定されていますか? Windows.hではそうではありませんか? – BuddyJoe
ディレクトリリストは、検討中のOS /プラットフォームによって大きく異なります。これは、さまざまなオペレーティングシステムがこれを達成するために独自の内部システムコールを使用しているためです。
この問題を解決するには、この問題を隠蔽して移植するライブラリを探します。残念ながら、すべてのプラットフォームで完璧に動作するソリューションはありません。 POSIX互換システムで
、あなたは(W.リチャードスティーヴンスによるUNIX帳の下で高度なプログラミングから元々参照されている)クレイトンによって投稿のコードを使用して、これを達成するためのライブラリを使用することができます。このソリューションは* NIXシステムで動作し、Cygwinがインストールされている場合はWindowsでも動作します。
また、あなたは、基盤となるOSを検出し、そのOSの下のディレクトリ構造をリストの「正しい」やり方を開催する適切なディレクトリリスト機能を呼び出すためのコードを書くことができます。
GLibはGTK +グラフィカルツールキットの基礎を形成するためのC移植/ユーティリティライブラリです。これはスタンドアロンのライブラリとして使用できます。
ディレクトリを管理するためのポータブルラッパーが含まれています。詳細については、Glib File Utilitiesのドキュメントを参照してください。
個人的には、私の後ろにGLibのようなものがなくても、大量のCコードを書いているとは思わないでしょう。可搬性は1つのことですが、データ構造、スレッドヘルパー、イベント、メインループなどを無料で入手するのもいいです。
ジークス、私はほとんどセールスマンのように聞こえ始めています:)(心配しないで、glibオープンソース(LGPL)と私はどのような方法でそれと提携していないよ)
+1;関連する関数は 'g_dir_read_name()' – weiqure
最も同様の方法readdir
には、おそらくあまり知られ_find
family of functionsを使用しています。
私はこの問題を扱うオープンソース(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);
これは元のシステム依存の実装よりもどのように役立ちますか?それとも、WindowsとPOSIXに名前付きライブラリが1つだけ必要なのですか? tinydir.hのための '投票のために' – kevr
、よくできました。 –
あなたはwikibooks link
/**************************************************************
* A simpler and shorter implementation of ls(1)
* ls(1) is very similar to the DIR command on DOS and Windows.
**************************************************************/
#include <stdio.h>
#include <dirent.h>
int listdir(const char *path)
{
struct dirent *entry;
DIR *dp;
dp = opendir(path);
if (dp == NULL)
{
perror("opendir");
return -1;
}
while((entry = readdir(dp)))
puts(entry->d_name);
closedir(dp);
return 0;
}
int main(int argc, char **argv) {
int counter = 1;
if (argc == 1)
listdir(".");
while (++counter <= argc) {
printf("\nListing %s...\n", argv[counter-1]);
listdir(argv[counter-1]);
}
return 0;
}
- 1. URLを取得するにはどうすればいいですか?C#
- 2. C#で書かれたWindowsサービスでServiceNameを取得するにはどうすればよいですか?
- 3. pyarangoでコレクションオブジェクトを取得するにはどうすればよいですか?
- 4. SQLでインクリメンタルカウンタを取得するにはどうすればよいですか?
- 5. WatchKitでETAを取得するにはどうすればよいですか
- 6. Vulkanでキューカウントを取得するにはどうすればよいですか?
- 7. アプリケーションレベルでネットワークメッセージを取得するにはどうすればよいですか?
- 8. Clojureでコールスタックを取得するにはどうすればよいですか?
- 9. oauthでparamsを取得するにはどうすればよいですか?
- 10. UIPickerViewでテキストを取得するにはどうすればよいですか?
- 11. grailsでデータベースインスタンスを取得するにはどうすればよいですか?
- 12. カスタムセルでtableViewを取得するにはどうすればよいですか?
- 13. プロジェクトライブラリでDaoSessionを取得するにはどうすればよいですか?
- 14. jsweetでtanhを取得するにはどうすればよいですか?
- 15. UIBarButtonItemでバッジを取得するにはどうすればよいですか?
- 16. IntervalIndexで値を取得するにはどうすればよいですか?
- 17. Oracleでブロックヘッダーサイズを取得するにはどうすればよいですか?
- 18. プログラムで_GLOBAL_OFFSET_TABLE_アドレスを取得するにはどうすればよいですか?
- 19. オーバーレイウィンドウでタッチイベントを取得するにはどうすればよいですか?
- 20. iText7でByteRangeを取得するにはどうすればよいですか?
- 21. アンドロイドでダイジェストを取得するにはどうすればよいですか?
- 22. ブレッドクラムアレイフォームをLaravelで取得するにはどうすればよいですか?
- 23. GuzzleでInvalidArgumentExceptionを取得するにはどうすればよいですか?
- 24. プログラムでサーブレットフィルタインスタンスを取得するにはどうすればよいですか?
- 25. sapui5でファイルサイズを取得するにはどうすればよいですか?
- 26. UDPClientでリモートエンドポイントを取得するにはどうすればよいですか?
- 27. PreferenceFragmentでonClickEventを取得するにはどうすればよいですか?
- 28. .NETでOutOfMemoryExceptionを取得するにはどうすればよいですか?
- 29. Puppeteerでソースポートを取得するにはどうすればよいですか?
- 30. フォームでセッションを取得するにはどうすればよいですか?
上のサンプルコードを見つけることができます。これは、少なくともMinGWのと、同様のWindows上で動作するはずです。 –
@ Claytonしかし、何文字を印刷するかわからないので、puts()を使用しないことを教えていますか? – YakRangi
これはどういう意味なのですか?エラー:不明な型名 'off64_t'' –