] 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 dirent
man 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;
}
'dirent'構造体には型フィールドがあります。例えば、 [このマニュアルページ](http://man7.org/linux/man-pages/man3/readdir.3.html)。また、['stat'](http://man7.org/linux/man-pages/man2/stat.2.html)を使って、「ファイル」に関するより詳しい情報を得ることができます。これは、 "ファイル"が実際のファイルかディレクトリかどうかだけを示します。ファイルが「テキスト」ファイルであるかどうかを知る方法はありません。実際にはそうではありません。拡張子(例: '.txt')はヒントを与えることができますが、それは真実である必要はありません。他の拡張子を持つ多くの "テキスト"ファイルもあります。 –
'opendir()'はエラー時にNULLを返します。エラーの原因が指定されたパスがディレクトリでない場合、 'errno'は' ENOTDIR'に設定されます。ディレクトリでない場合は、標準のIO機能を使用して読み込みを試みてください。 – Peter