2016-12-20 9 views
0
#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; 
} 

このコードは、私にそのディレクトリのすべてのものを与えます。 "ls"コマンドのように動作します。たとえば、私は名前が "フォルダ"であり、名前が "入力"(名前が異なるかもしれないbtw)である1つのフォルダがそのディレクトリにあるとしましょう。私はそれがフォルダかtx​​tファイルかどうかを決めたいと思っています。もしそれがtxtファイルなら、どうすれば読むことができますか?選択されたディレクトリのtxtファイルを読む

+0

'dirent'構造体には型フィールドがあります。例えば、 [このマニュアルページ](http://man7.org/linux/man-pages/man3/readdir.3.html)。また、['stat'](http://man7.org/linux/man-pages/man2/stat.2.html)を使って、「ファイル」に関するより詳しい情報を得ることができます。これは、 "ファイル"が実際のファイルかディレクトリかどうかだけを示します。ファイルが「テキスト」ファイルであるかどうかを知る方法はありません。実際にはそうではありません。拡張子(例: '.txt')はヒントを与えることができますが、それは真実である必要はありません。他の拡張子を持つ多くの "テキスト"ファイルもあります。 –

+0

'opendir()'はエラー時にNULLを返します。エラーの原因が指定されたパスがディレクトリでない場合、 'errno'は' ENOTDIR'に設定されます。ディレクトリでない場合は、標準のIO機能を使用して読み込みを試みてください。 – Peter

答えて

0

] scandir()機能を使用すると、ディレクトリ内のエントリを開いてスキャンすることができます。現在のエントリがd_typeフィールドによって、通常のファイル、ディレクトリや他の人であるかどうかをチェックすることができます

struct dirent { 
    ino_t   d_ino;  /* inode number */ 
    off_t   d_off;  /* offset to the next dirent */ 
    unsigned short d_reclen; /* length of this record */ 
    unsigned char d_type;  /* type of file; not supported 
           by all file system types */ 
    char   d_name[256]; /* filename */ 
}; 

例はstruct direntman 3 scandir

#define _SVID_SOURCE 
/* print files in current directory in reverse order */ 
#include <dirent.h> 

int 
main(void) 
{ 
    struct dirent **namelist; 
    int n; 

    n = scandir(".", &namelist, NULL, alphasort); 
    if (n < 0) 
     perror("scandir"); 
    else { 
     while (n--) { 
      printf("%s\n", namelist[n]->d_name); 
      free(namelist[n]); 
     } 
     free(namelist); 
    } 
} 

注意から来ています。

利用可能なファイルの種類は次のとおりです。

#define DT_UNKNOWN  0 
#define DT_FIFO   1 
#define DT_CHR   2 
#define DT_DIR   4 // directory type 
#define DT_BLK   6 
#define DT_REG   8 // regular file, txt file is a regular file 
#define DT_LNK   10 
#define DT_SOCK   12 
#define DT_WHT   14 

ファイルの名前と種類をチェックした後、あなたは安全にopen()(システムコール)またはfopen()(glibの機能)でそれを開き、read()で内容を読み取ることができます(もしあなたは(オープン経由でファイルを開く)またはfread()(のfopen()対応)。

読み取り後にファイルを閉じることを忘れないでください。

以外にも、あなただけの存在を確認したい場合ディレクトリのアクセシビリティはaccess()です。

以下のコードは、ディレクトリが存在するかどうかをテストしています。

int exist_dir (const char *dir) 
{ 
    DIR *dirptr; 

    if (access(dir, F_OK) != -1) { 
     // file exists 
     if ((dirptr = opendir(dir)) != NULL) { 
      // do something here 
      closedir (dirptr); 
     } else { 
      // dir exists, but not a directory 
      return -1; 
     } 
    } else { 
     // dir does not exist 
     return -1; 
    } 

    return 0; 
} 
0

コンテンツ以外のファイルに関するすべての情報は、関数statを呼び出すことで取得できます。 statbufによって指さ署名

int stat(const char *pathname, struct stat *buf); 

を有し、バッファ内のファイルに関する情報を返します。

struct statは、ファイルタイプとファイル許可の情報をフィールドst_modeにエンコードします。

S_ISREG(M)、それは通常のファイルです:

いくつかの追加のマクロは、ファイルの種類をテストするために定義されていますか?

S_ISDIR(m)ディレクトリ?

文字デバイスS_ISCHR(m)?

S_ISBLK(m)ブロックデバイス?

S_ISFIFO(m)FIFO(名前付きパイプ)?

S_ISLNK(m)シンボリックリンク? (POSIX.1-1996にはない)

S_ISSOCK(m)socket? (POSIX.1-1996にはない。ここ)

サンプル・コードの一部である:このように、機能sprintfを用いて、読み出し用として

stat(pathname, &sb); 
if (S_ISREG(sb.st_mode)) { 
    /* Handle regular file */ 
} 

、CONCATENATEディレクトリパスとファイル名、ファイルパスを取得する:

sprintf(file_path, "%s/%s", dir_path, file_name); 
関連する問題