LINUX下用C語言歷遍目錄 C語言列出目錄2007-04-06 21:02功能: Linux下C語言目錄歷遍 (讀取目錄)
作者: 小徐
QQ: 339534039
轉(zhuǎn)載請(qǐng)注明出處
呵呵,LINUX下歷遍目錄的方法一般是這樣的
打開目錄-》讀取-》關(guān)閉目錄
相關(guān)函數(shù)是
opendir -> readdir -> closedir
#include <dirent.h>
DIR *opendir(const char *dirname);
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
#include <dirent.h>
int closedir(DIR *dirp);
好了,三個(gè)函數(shù)都出來了呵呵,原型就是上面,給自己解釋一下免得以后我自己忘了呵呵!我以經(jīng)忘過好幾回了,所以這次放上博客來
opendir用于打開目錄,是類似于流的那種方式,返回一個(gè)指向DIR結(jié)構(gòu)體的指針?biāo)膮?shù)*dirname是一個(gè)字符數(shù)組或者字符串常量,
readdir函數(shù)用于讀取目錄,他只有一個(gè)參數(shù),這個(gè)參數(shù)主opendir返回的結(jié)構(gòu)體指針,或者叫句柄更容易理解些吧。這個(gè)函數(shù)也返回一個(gè)結(jié)構(gòu)
體指針 dirent *
dirent的結(jié)構(gòu)如下定義
struct dirent
{
long d_ino; /* inode number */
off_t d_off; /* offset to this dirent */
unsigned short d_reclen; /* length of this d_name */
char d_name [NAME_MAX+1]; /* file name
(null-terminated) */
}
結(jié)構(gòu)體中d_ino存放的是該文件的結(jié)點(diǎn)數(shù)目,什么是結(jié)點(diǎn)數(shù)目呢我也說不清楚了呵呵,查一下其它資料了
d_off 是文件在目錄中的編移,具體是什么意思我也不是很明白,我很少用到它,其本上就是用到d_name short
d_reclen是這個(gè)文件的長(zhǎng)度,需要注意的是這里的長(zhǎng)度并不是指文件大小,因?yàn)榇笮『烷L(zhǎng)度是2回事了,你可以用lseek將文件長(zhǎng)度移得很長(zhǎng),但大小
其實(shí)還是那么大.最后一個(gè)元素就是我們要的了,文件名稱!
寫了一個(gè)實(shí)例:
/**
* 功能: Linux下C語言目錄歷遍 (讀取目錄)
* 作者: 小徐
* 郵箱: xjtdy888@163.com
* QQ: 339534039
* 轉(zhuǎn)載請(qǐng)注明出處
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
void print_usage(void);
void print_usage(void)
{
printf("Usage: test dirname\n");
}
int main(int argc,char *argv[])
{
DIR * dp;
struct dirent *filename;
if (argc < 2)
{
print_usage();
exit(1);
}
dp = opendir(argv[1]);
if (!dp)
{
fprintf(stderr,"open directory error\n");
return 0;
}
while (filename=readdir(dp))
{
printf("filename:%-10s\td_info:%ld\t d_reclen:%us\n",
filename->d_name,filename->d_ino,filename->d_reclen);
}
closedir(dp);
return 0;
}
將上面代碼保存為readdir.c執(zhí)行下面的命令進(jìn)行編譯測(cè)試
[root@phpos ~]# gcc readdir.c
[root@phpos ~]# ./a.out
Usage: test dirname
[root@phpos ~]# ./a.out /etc/samba/
filename:lmhosts d_info:49296 d_reclen:24s
filename:smb.conf d_info:49825 d_reclen:24s
filename:smbpasswd d_info:49402 d_reclen:24s
filename:.. d_info:47906 d_reclen:16s
filename:secrets.tdb d_info:49812 d_reclen:24s
filename:. d_info:49295 d_reclen:16s
filename:smbusers d_info:49377 d_reclen:24s
[root@phpos ~]# ./a.out /var/
filename:preserve d_info:31971 d_reclen:24s
filename:lock d_info:31966 d_reclen:16s
filename:yp d_info:31976 d_reclen:16s
filename:empty d_info:31962 d_reclen:24s
filename:run d_info:31972 d_reclen:16s
filename:lib d_info:31939 d_reclen:16s
filename:nis d_info:31969 d_reclen:16s
filename:local d_info:31965 d_reclen:24s
filename:spool d_info:31973 d_reclen:24s
filename:tmp d_info:31941 d_reclen:16s
filename:opt d_info:31970 d_reclen:16s
filename:log d_info:31959 d_reclen:16s
filename:crash d_info:31997 d_reclen:24s
filename:.. d_info:2 d_reclen:16s
filename:account d_info:32037 d_reclen:24s
filename:mail d_info:31968 d_reclen:16s
filename:cache d_info:31960 d_reclen:24s
filename:db d_info:31961 d_reclen:16s
filename:. d_info:31938 d_reclen:16s
[root@phpos ~]#
轉(zhuǎn)載地址:http://hi.baidu.com/phps/blog/item/92120fd1645fc9d2562c840a.html
posted on 2010-04-14 23:23
chatler 閱讀(397)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Linux_Coding