Linux扫描目录
相关函数:scandir, opendir, readdir, alphasort
表头文件:#include <dirent.h>
定 义函数: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字符 */
}
下面是更详细的定义,摘自:
http://www.delorie.com/gnu/docs/glibc/libc_270.html
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 thest_ino
member thatstat
will return for the file. See section 14.9 File Attributes. 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 15.3 FIFO Special Files.
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 thest_mode
member ofstruct statbuf
. If the value cannot be determine the member value is DT_UNKNOWN. These two macros convert betweend_type
values andst_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.