2009年03月10日

fileの一覧を取得する。

glibにはファイル一覧を取得する関数もあり簡単に使えるのだが
glibを使わない場合どんなものなのか試してみた。
system命令で"ls"を呼ぶ手もあるが今回は関数のみを使用する。
要するにperlのFile::Findを置き換えられるようにする。
opendirという命令があるらしいというので
manを調べると
opendir, readdir, readdir_r, telldir, seekdir, rewinddir, closedir, dirfd
などの命令があるらしい。
必要なヘッダーは


#include <sys/types.h>
#include <dirent.h>

ということのようだ。

特有の変数や構造体として

DIR   *dirp;
struct dirent  *result;

を使い。

opendirでDIRのインスタンスを取得し
readdirを行うごとにdirentを取得し場所をひとつすすめ
ファイルがなくなるとreaddirの返り値はNULLになる。

最後はclosedirで閉じる
という流れになる様だ。


struct dirent {
__uint32_t d_fileno; /* file number of entry */
__uint16_t d_reclen; /* length of this record */
__uint8_t d_type; /* file type, see below */
__uint8_t d_namlen; /* length of string in d_name */
char d_name[255 + 1];

ということなのでd_typeとd_nameをみればよさそうだ。
d_filenoはなんの番号かわからなかった。d_namlenはstring系の描画命令には必要だが
ファイル名はnullが加えられているので一般的なchar関数が使える。


d_typeは

#define DT_UNKNOWN 0
#define DT_FIFO 1
#define DT_CHR 2
#define DT_DIR 4
#define DT_BLK 6
#define DT_REG 8
#define DT_LNK 10
#define DT_SOCK 12
#define DT_WHT 14

と定義されている。
とりあえずディレクトリーの4とリンクの10が要注意という所だろうか。

structを毎回書くのは億劫なのでtypedefでDirent型とした。


#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>

int main (int argc,char *argv[])
{
//type
typedef struct dirent Dirent;

//var
DIR *dirp;
Dirent *result;

//begen
if((dirp=opendir(".")) == NULL ){
puts("not opendir");
return(1);
}

while ((result = readdir(dirp)) != NULL){
printf("%s,%d\n",result->d_name,result->d_type);
}
closedir(dirp);

return(0);
}

telldirはrewinddirを使ってもどんどん加算されていて
seekdirも使ってみたのだが機能していなかった。


printf("%d;\n",sizeof(*result));

としたところ264になった。やはりファイル名の最大は255の様だ。

ちなみに「現在のpath」は


getenv("PWD")

で取得できる様だ。
ラベル:ディレクトリ
posted by Xo_ox at 23:58| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。