感谢支持
我们一直在努力

Linux系统下读取目录中文件名信息题解(含源代码)

为了项目需要,需在软件增加插件功能。为了尽量减少主程序的改动(尽量不改动),需要动态扫描插件目录中的文件,以便自动增减插件,从而实现不同的功能。


为了帮助读者理解下面的工作原理,先将一些预备知识:


在Linux系统中,一切设备皆为文件!什么意思呢?就是说,在Linux系统中,不管文件系统中挂载了什么设备或是出现了什么目录,系统皆将它们看成文件。这有别于windows系统。因此,在Linux系统中实现上述操作,要远简单于windows系统。好了,知道这些就足够了:)


现特地为读取目录中文件名信息进行了如下方式的解题:


1、添加include语句:
#include <sys/types.h>
#include <dirent.h>
2、在源程序中声明以下变量:
声明结构体指针 struct dirent * ptr;
声明一个dir指针 DIR * fd;
必要的时候可以malloc或new.
3、使用opendir()函数打开目录文件
opendir()函数原型如下:
DIR *opendir(const char *name);
4、使用readdir()函数读取目录中文件内容
readdir()函数原型如下:
struct dirent *readdir(DIR *dir);
readdir()每次从目录文件中提取一个文件项目,指针前移。直至到文件末尾返回NULL值。ptr指针指向     readdir()返回的dirent 结构体,每次函数调用返回的结果不同 dirent中的成员内容不同,其中d_name成员的值为每次读取到的目录中的文件名称。


详细信息,可参考下文的源程序。

另外,在这里还可一增加步骤5、
输出重定向:
使用到的函数为:
FILE *freopen(const char *path, const char *mode, FILE *stream);
其中:mode: r,r+,w,w+,a,a+
6、使用free()释放动态申请的内存空间并使用closedir()关闭打开的文件指针。


实例源代码如下:


/* *
*    author:    Yongsheng Zhang
*     title:    readdir.c
*     time:    2009年11月26日
* */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <malloc.h>
#include <string.h>
#include <errno.h>


int main(int argc, char **argv)
{
if(argc == 1)
{
printf(“\nUsage:\n\t%s dirpath \n\n”,argv[0]);
return 0;
}
else
printf(“\nUsage:\n\t%s dirpath\n\n”,argv[0]);
char *dir = (char *) malloc(256);
strcpy(dir,argv[1]);
struct dirent *ptr = (struct dirent *)malloc(sizeof(struct dirent));
DIR * fd;
fd = opendir(dir);
if (!fd)
{
switch(errno)
{
case EACCES :
printf(“Permission denied. \n”);
break;
case EMFILE :
printf(“Too many file descriptors in use by process.\n”);
break;
case ENFILE :
printf(“Too many files are currently open in the system. \n”);
break;
case ENOENT :
printf(“Directory does not exist, or name is an empty string. \n”);
break;
case ENOMEM :
printf(“Insufficient memory to complete the operation. \n”);
break;
case ENOTDIR :
printf(“name is not a directory.\n”);
break;
}
}


printf(“number\tInode_number\toffset_to_the_next_dirent\tlength_of_this_record\ttype_of_file\tfilename\n”);


int i = 1;
while(NULL != (ptr = readdir(fd)))
{
printf(“%6d%12ld\t%25ld\t%21d\t%11u\t%s\n”,i++,ptr->d_ino,ptr->d_off,ptr->d_reclen,ptr->d_type,ptr->d_name);
}
free(dir);
free(ptr);
closedir(fd);


return 0;
}

赞(0) 打赏
转载请注明出处:服务器评测 » Linux系统下读取目录中文件名信息题解(含源代码)
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏