导航:首页 > 操作系统 > readdirlinux

readdirlinux

发布时间:2022-08-05 16:34:36

1. 在linux内核里怎么调用opendir和readdir

opendir和readdir等都是库函数,想在内核中调用是不可能的。 Unix把directory看作file,
在file_operations中有readdir成员,inode_operations中有rmdir/mkdir成员。 对于具体的文件系统,
以ext3为例, 则有ext3_dir_operations和ext3_dir_inode_operations。 这些是从磁盘read
inode时初始化的。

只能说到这里了, 如果这个任务让我实现, 我会边读书边用代码探索。。。。

2. linux中,什么函数可以读取目录

LINUX下历遍目录的方法一般是这样的
打开目录-》读取-》关闭目录
相关函数是
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语言目录历遍 (读取目录)
* 作者: 小徐
* 邮箱: [email protected]
* 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.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 ~]#
程序正常执行!到此完了呵呵!!

3. linux 为什么while(dirp = readdir(dp) != NULL)可以实现循环读取呢..谁能给我说

opendir和readdir的原理决定的
你可以认为 opendir后 打开的是一个文件夹,这个文件夹指向一个结构体
也就是返回的dp
而dp里面有一个链表,或者数组
每次readdir就把这个数据向前移动一位,并返回当前文件节点dirp
等这个链表 移动到尾部,就是返回NULL,这时就代表遍历结束了。

4. Linux,谁帮忙看看这段程序,用readdir()怎么什么都读不到,路径下是有文件的

...郁闷,调试了好半天才发现错误,开始都一直在看库函数调用的问题,找了半天也没错,只有单步调试了,单步调试才看到错误,你看你的传回目录链表的节点那的判断语句
if(dir_head=NULL)
dir_head=cur_item;
这样传回的值不是空才怪呢..应该是if(dir_head==NULL)

5. 在linux下的c语言编程时使用readdir的时候读取到的“.”和“..”怎么去掉

//跳过他们就行,例如
while ((dirp = readdir(dp)) != NULL) {
if (strcmp(dirp->d_name, ".") == 0 ||
strcmp(dirp->d_name, "..") == 0)
continue; /* ignore dot and dot-dot */

/* do something */
}

//什么叫判断不出来?你的具体的语句是什么?

6. linux 下c语言利用readdir获取文件夹目录错误提示:segmentation fault~求达人看程序给解~

不说你了。
while(entry=readdir(dirpt));

这行后面有个分号发现没,给我去掉。
这行就是个空语句。
占位用的。可以这么理解
while(entry=readdir(dirpt))
这里啥都不干;

下面那一行的entry 就成 NULL了,他没有d_name,所以段错误

7. Linux下C语言编程用的readdir()实例

第一:linux下不成认无返回值的main方法
第二:你这个若成功,也只能够读取/etc/rc.d目录下的内容

#include<sys/types.h>
#include <stdio.h>
#include<dirent.h>
#include<unistd.h>
int main(int argc,char **argv)
{
DIR * dir;
struct dirent * ptr;
int i;
if(argc==1)
dir=opendir("./");
else
dir=opendir(argv[1]);
while((ptr=readdir(dir))!=NULL)
{
printf("d_name: %s\n",ptr->d_name);//需要更详细的信息你可以修改该句
}
closedir(dir);
return 0;
}

8. linux中readdir是按照什么顺序读一个文件夹下的文件的

readdir是按照在磁盘上的文件索引顺序读上来的,由文件系统自动控制的。
如果想排序的话,只能自己来做。

阅读全文

与readdirlinux相关的资料

热点内容
vr一体机能用什么app 浏览:166
程序员右背很痛 浏览:739
哪个app可以看琉璃原着 浏览:47
捣练图pdf 浏览:284
公司内部如何搭建网络服务器 浏览:654
自助火锅哪个app好 浏览:848
pdf使用说明 浏览:709
蝙蝠app的服务器在哪个国家 浏览:581
我的世界怎么做出超平坦服务器 浏览:329
qq内的照片加密 浏览:120
抵押车app哪个好 浏览:329
如何用单片机控制伺服电机 浏览:271
手指计算法视频 浏览:772
java键盘全局监听 浏览:682
华为交换机退出命令 浏览:852
神龙云服务器相关上市公司 浏览:366
加主播解压什么意思 浏览:890
如何往win10的服务器添加网站 浏览:148
动机与人格pdf 浏览:954
python写qq脚本 浏览:631