Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4241731
  • 博文数量: 176
  • 博客积分: 10059
  • 博客等级: 上将
  • 技术积分: 4681
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-24 12:27
文章分类

全部博文(176)

文章存档

2012年(1)

2011年(4)

2010年(14)

2009年(71)

2008年(103)

分类: C/C++

2009-12-27 16:58:36

相关函数: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 <dirent.h>

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<total; i++)
                 printf("%s\n", namelist->d_name);
           printf("total = %d\n", total);

           free( namelist );
    }
}


--------------------------------------------------------------------------
struct dirent 目录路径定义:
#include <dirent.h>
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_fileno
This 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 .

unsigned char d_namlen
This 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 size

unsigned char d_type
This is the type of the file, possibly unknown. The following constants are defined for its value:

DT_UNKNOWN
The type is unknown. On some systems this is the only value returned.

DT_REG
A regular file.

DT_DIR
A directory.

DT_FIFO
A named pipe, or FIFO. See section .

DT_SOCK
A local-domain socket.

DT_CHR
A character device.

DT_BLK
A 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.


 

阅读(4538) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

4103230802013-09-28 23:58:16

C++ 无法编译 你能绑我解决吗? 我愿意出钱让你帮我做一款好吗QQ 410323080