linux c 扫描目录函数,Linux扫描目录 - Linux C/C++ - 小宝--读书笔记

相关函数:scandir, opendir, readdir, alphasort

表头文件:#include  

定义函数:int  scandir(const char *dir, struct dirent **namelist, nt (*select)  (const  struct  dirent *), nt (*compar)  (const struct dirent **, const struct dirent**));

函数说明:scandir()会扫描参数dir指定的目录文件,经由参数select指定的函数来挑选目录结构至参数namelist数组中,最后再调用参数compar指定的函数来排序namelist数组中的目录数据。每次从目录文件中读取一个目录结构后便将此结构传给参数select所指的函数, select函数若不想要将此目录结构复制到namelist数组就返回0,若select为空指针则代表选择所有的目录结构。scandir()会调用qsort()来排序数据,参数compar则为qsort()的参数,若是要排列目录名称字母则可使用alphasort(). 结构dirent定义请参考readdir()

返回值  :成功则返回复制到namelist数组中的数据结构数目,有错误发生则返回-1

错误代码:ENOMEM 核心内存不足

/* 读取 / 目录下文件名长度大于5的目录结构 */

#include

int select(const struct dirent *dir)

{

if(strlen(dir->d_name) > 5)

return 1;

else

return 0;

}

main()

{

struct dirent **namelist;

int i, total;

if(total < 0)

perror("scandir");

else

{

for(i=0; i

printf("%s\n", namelist->d_name);

printf("total = %d\n", total);

free( namelist );

}

}

--------------------------------------------------------------------------

struct dirent 目录路径定义:

#include

struct dirent

{

long d_ino; /* inode number 索引节点号 */

off_t d_off; /* offset to this dirent 在目录文件中的偏移 */

unsigned short d_reclen; /* length of this d_name 文件名长 */

unsigned char d_type; /* the type of d_name 文件类型 */

char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */

}

下面是更详细的定义,摘自:

This is a structure type used to return information about directory entries. It contains the following fields:

char d_name[]This is the null-terminated file name component. This is the only field you can count on in all POSIX systems.ino_t d_filenoThis is the file serial number. For BSD compatibility, you can also refer to this member as d_ino. In the GNU system and most POSIX systems, for most files this the same as the st_ino member that stat will return for the file. See section 14.9 File Attributes.unsigned char d_namlenThis is the length of the file name, not including the terminating null character. Its type is unsigned char because that is the integer type of the appropriate sizeunsigned char d_typeThis is the type of the file, possibly unknown. The following constants are defined for its value:

DT_UNKNOWNThe type is unknown. On some systems this is the only value returned.DT_REGA regular file.DT_DIRA directory.DT_FIFOA named pipe, or FIFO. See section 15.3 FIFO Special Files.DT_SOCKA local-domain socket.DT_CHRA character device.DT_BLKA block device.

This member is a BSD extension. The symbol _DIRENT_HAVE_D_TYPE is defined if this member is available. On systems where it is used, it corresponds to the file type bits in the st_mode member of struct statbuf. If the value cannot be determine the member value is DT_UNKNOWN. These two macros convert between d_type values and st_mode values:

Function: int IFTODT (mode_t mode)This returns the d_type value corresponding to mode.

Function: mode_t DTTOIF (int dtype)This returns the st_mode value corresponding to dtype.

This structure may contain additional members in the future. Their availability is always announced in the compilation environment by a macro names _DIRENT_HAVE_D_xxx where xxx is replaced by the name of the new member. For instance, the member d_reclen available on some systems is announced through the macro _DIRENT_HAVE_D_RECLEN.

When a file has multiple names, each name has its own directory entry. The only way you can tell that the directory entries belong to a single file is that they have the same value for the d_fileno field.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值