打开目录-》读取-》关闭目录
相关函数是
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)
好了,三个函数都出来了呵呵,原型就是上面,给自己解释一下免得以后我自己忘了呵呵!我以经忘过好几回了,所以这次放上博客来
opendir用于打开目录,是类似于流的那种方式,返回一个指向DIR结构体的指针他的参数*dirname是一个字符数组或者字符串常量,
readdir函数用于读取目录,他只有一个参数,这个参数主opendir返回的结构体指针,或者叫句柄更容易理解些吧。这个函数也返回一个结构体指针 dirent *
dirent的结构如下定义
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) */
}
结构体中d_ino存放的是该文件的结点数目,什么是结点数目呢我也说不清楚了呵呵,查一下其它资料了
d_off 是文件在目录中的编移,具体是什么意思我也不是很明白,我很少用到它,其本上就是用到d_name short d_reclen是这个文件的长度,需要注意的是这里的长度并不是指文件大小,因为大小和长度是2回事了,你可以用lseek将文件长度移得很长,但大小其实还是那么大.最后一个元素就是我们要的了,文件名称!
写了一个实例:
/**
* 功能: Linux下C语言目录历遍 (读取目录)
* 作者: 小徐
* 邮箱: xjtdy888@163.com
* QQ: 339534039
* 转载请注明出处
*/
#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执行下面的命令进行编译测试
[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.confd_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:smbusersd_info:49377 d_reclen:24s
[root@phpos ~]# ./a.out /var/
filename:preserved_info:31971 d_reclen:24s
filename:lockd_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:maild_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 ~]#
程序正常执行!到此完了呵呵!!
opendir和readdir的原理决定的你可以认为 opendir后 打开的是一个文件夹,这个文件夹指向一个结构体
也就是返回的dp
而dp里面有一个链表,或者数组
每次readdir就把这个数据向前移动一位,并返回当前文件节点dirp
等这个链表 移动到尾部,就是返回NULL,这时就代表遍历结束了。
Linux *** 作系统的功能有以下这些:
1、linux的软件丰富,windows下各种软件基本上都能在linux下找到相应的替代,多到你自己不知选择哪个好,而且基本上是免费获得的,可以免除版权的困扰。并且linux下还有许多windows下没有的软件。
2、Linux安全稳定,没有病毒和木马。适合做大型 的服务器,基本上少有Windows下那么多的病毒,除非你自己想中毒。
3、Linux速度快。一般来说,windows会越来越慢,而Linux不存在这种问题。
4、Linux界面漂亮,桌面服务也在逐渐完善,像ubuntu就很易用,windows统治桌面的时代正在远去。
5、Linux价格低廉,促使Linux成为服务器的不二选择,而且linux还特别适用于嵌入式开发。
6、Linux自由开放。这不仅仅是指价格,而且指你可以详细了解程序的内部机制和 *** 作系统的细节,甚至可以动手修改。对于非技术人员来说,你也可以感觉到Linux的自由气氛,这已经是一种人文精神了。
Linux *** 作系统:
Linux *** 作系统是基于UNIX *** 作系统发展而来的一种克隆系统,它诞生于1991 年的 [Linux桌面] 10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类 *** 作系统,并且使用人数还在迅猛增长。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)