2008-08-15 34 views

答えて

5

opendir/readdirはPOSIXです。

68

以下は、現在のディレクトリ内のファイルの名前を出力しますチェック厳密な答えは "できません"です。フォルダのコンセプトは本当にクロスプラットフォームではないためです。

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

ここでC-FAQの答えです:

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

+1

上のサンプルコードを見つけることができます。これは、少なくともMinGWのと、同様のWindows上で動作するはずです。 –

+1

@ Claytonしかし、何文字を印刷するかわからないので、puts()を使用しないことを教えていますか? – YakRangi

+0

これはどういう意味なのですか?エラー:不明な型名 'off64_t'' –

18

#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

+0

に変更すると、_findfirst、_findnext、_findcloseの別名が既に設定されていますか? Windows.hではそうではありませんか? – BuddyJoe

9

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

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

+0

Boost :: filesystem ?? – paxos1977

+1

@ceretullis: "標準"という単語に注意してください。ブーストは標準ではありません。 – krebstar

+23

ブーストもCではありません。 –

2

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

この問題を解決するには、この問題を隠蔽して移植するライブラリを探します。残念ながら、すべてのプラットフォームで完璧に動作するソリューションはありません。 POSIX互換システムで

、あなたは(W.リチャードスティーヴンスによるUNIX帳の下で高度なプログラミングから元々参照されている)クレイトンによって投稿のコードを使用して、これを達成するためのライブラリを使用することができます。このソリューションは* NIXシステムで動作し、Cygwinがインストールされている場合はWindowsでも動作します。

また、あなたは、基盤となるOSを検出し、そのOSの下のディレクトリ構造をリストの「正しい」やり方を開催する適切なディレクトリリスト機能を呼び出すためのコードを書くことができます。

7

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

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

個人的には、私の後ろにGLibのようなものがなくても、大量のCコードを書いているとは思わないでしょう。可搬性は1つのことですが、データ構造、スレッドヘルパー、イベント、メインループなどを無料で入手するのもいいです。

ジークス、私はほとんどセールスマンのように聞こえ始めています:)(心配しないで、glibオープンソース(LGPL)と私はどのような方法でそれと提携していないよ)

+2

+1;関連する関数は 'g_dir_read_name()' – weiqure

13

私はこの問題を扱うオープンソース(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); 
+0

これは元のシステム依存の実装よりもどのように役立ちますか?それとも、WindowsとPOSIXに名前付きライブラリが1つだけ必要なのですか? tinydir.hのための '投票のために' – kevr

+0

、よくできました。 –

-1

あなたは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; 
} 
関連する問題