linux opendir和readdir的使用

来源:互联网 发布:廉价口红知乎 编辑:程序博客网 时间:2024/05/21 05:41


1    opendir

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);


传入name路径,成功则返回非空DIR指针,否则返回NULL


2    readdir


     #include <dirent.h>


       struct dirent *readdir(DIR *dirp);


       int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);


readdir一般要配合opendir使用,readdir不是线程安全函数,代替他的有readdir_r。

readdir返回 struct dirent *指针,读完目录下所有文件时,返回NULL


如果系统支持readdir_r,建议用readdir_r , readdir_r成功返回0。


关于struct dirent结构体:

 On Linux, the dirent structure is defined as follows:


  struct dirent {
      ino_t      d_ino;   /* inode number */
      off_t      d_off;   /* not an offset; see NOTES */
      unsigned short d_reclen;    /* length of this record */
      unsigned char  d_type;  /* type of file; not supported
     by all filesystem types */
      char      d_name[256]; /* filename */
  };


3    closedir

      #include <sys/types.h>


       #include <dirent.h>


       int closedir(DIR *dirp);

closedir配合opendir使用。



#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <dirent.h>#include <errno.h>//DIR *opendir(const char *name);#ifndef  LOG_TRACE#define LOG_TRACE printf#define LOG_INFO(msg)  \do{ \LOG_TRACE msg; \LOG_TRACE("[%s %d] \n",__FUNCTION__,__LINE__);\}while(0)#define LOG_ERROR(err_info)  \do{ \LOG_TRACE err_info; \LOG_TRACE("[%s %d]  \n",__FUNCTION__,__LINE__);\}while(0)#endifextern int errno;int open_dir_1(const char *pDirname){DIR * dirp = NULL; struct dirent * pDirent= NULL;if((NULL == pDirname) ||(0 == strlen(pDirname))){LOG_ERROR(("param error"));return -1;}dirp = opendir(pDirname);if (NULL == dirp){LOG_ERROR(("opendir %s failed! error_no: %s",pDirname , strerror(errno)));return -1;}while (NULL != (pDirent = readdir(dirp))){if (pDirent->d_type == DT_DIR ){LOG_ERROR(("dir      [%s]       ",pDirent->d_name));}else if(pDirent->d_type == DT_REG){LOG_ERROR(("file     [%s]        ",pDirent->d_name));}}closedir(dirp);return 0;}int open_dir_2(const char *pDirname){DIR * dirp = NULL; struct dirent * pDirent= NULL;struct dirent *pStResult = NULL;if((NULL == pDirname) ||(0 == strlen(pDirname))){LOG_ERROR(("param error"));return -1;}dirp = opendir(pDirname);if (NULL == dirp){LOG_ERROR(("opendir %s failed! error_no: %s",pDirname , strerror(errno)));return -1;}pDirent = (struct dirent *)malloc(sizeof(struct dirent));if(!pDirent){LOG_ERROR(("pDirent error"));closedir(dirp);return -1;}while (( 0== readdir_r(dirp,pDirent,&pStResult))&&(pStResult != NULL)){if (pDirent->d_type == DT_DIR ){LOG_ERROR(("dir      [%s]       ",pDirent->d_name));}else if(pDirent->d_type == DT_REG){LOG_ERROR(("file     [%s]        ",pDirent->d_name));}}closedir(dirp);return 0;}int main(){LOG_ERROR(("***********"));open_dir_1("/share/");LOG_ERROR(("------------"));open_dir_2("/share/");LOG_ERROR(("-++--+++--"));return 0;}


运行结果:


./a.out [19@gcc test_opendir_readdir.c
root@ubuntu:/share# 
root@ubuntu:/share# 
root@ubuntu:/share# gcc test_opendir_readdir.c 
/a.out 
***********[main 113]  
file     [zlib-1.2.8.tar.gz]        [open_dir_1 54]  
file     [1.tmp]        [open_dir_1 54]  
file     [log.c]        [open_dir_1 54]  
file     [list.c]        [open_dir_1 54]  
dir      [11]       [open_dir_1 50]  
file     [test.out]        [open_dir_1 54]  
file     [test_system_func.c]        [open_dir_1 54]  
file     [a.out]        [open_dir_1 54]  
file     [test_strncpy.c]        [open_dir_1 54]  
file     [test_proc_partitions.c]        [open_dir_1 54]  
file     [test.c]        [open_dir_1 54]  
file     [New0001.c]        [open_dir_1 54]  
dir      [curl-7.51.0]       [open_dir_1 50]  
file     [test_ftok.c]        [open_dir_1 54]  
file     [log.h]        [open_dir_1 54]  
file     [test_gettimeofday.c]        [open_dir_1 54]  
file     [csdn.c]        [open_dir_1 54]  
file     [client.c]        [open_dir_1 54]  
file     [1.txt]        [open_dir_1 54]  
file     [test_opendir_readdir.c]        [open_dir_1 54]  
file     [curl-7.51.0.tar.gz]        [open_dir_1 54]  
file     [2.txt]        [open_dir_1 54]  
file     [opendir.c]        [open_dir_1 54]  
dir      [zlib-1.2.8]       [open_dir_1 50]  
file     [123.rmvb]        [open_dir_1 54]  
dir      [ffmpeg_learn]       [open_dir_1 50]  
file     [test_sem.c]        [open_dir_1 54]  
file     [test_list.c]        [open_dir_1 54]  
file     [list.h]        [open_dir_1 54]  
file     [server]        [open_dir_1 54]  
dir      [ProFFmpeg]       [open_dir_1 50]  
dir      [ffmpeg-3.1.6]       [open_dir_1 50]  
dir      [yasm-1.3.0]       [open_dir_1 50]  
file     [New0003.c]        [open_dir_1 54]  
dir      [.]       [open_dir_1 50]  
dir      [..]       [open_dir_1 50]  
file     [ffmpeg-3.1.6.tar.gz]        [open_dir_1 54]  
file     [types.h]        [open_dir_1 54]  
file     [New0002.c]        [open_dir_1 54]  
file     [simple.out]        [open_dir_1 54]  
file     [server.c]        [open_dir_1 54]  
dir      [learn]       [open_dir_1 50]  
file     [simple_ffmpeg_player.c]        [open_dir_1 54]  
file     [client]        [open_dir_1 54]  
dir      [abc]       [open_dir_1 50]  
file     [yasm-1.3.0.tar.gz]        [open_dir_1 54]  
file     [output.yuv]        [open_dir_1 54]  
file     [mySDLFirst.out]        [open_dir_1 54]  
------------[main 115]  
file     [zlib-1.2.8.tar.gz]        [open_dir_2 100]  
file     [1.tmp]        [open_dir_2 100]  
file     [log.c]        [open_dir_2 100]  
file     [list.c]        [open_dir_2 100]  
dir      [11]       [open_dir_2 96]  
file     [test.out]        [open_dir_2 100]  
file     [test_system_func.c]        [open_dir_2 100]  
file     [a.out]        [open_dir_2 100]  
file     [test_strncpy.c]        [open_dir_2 100]  
file     [test_proc_partitions.c]        [open_dir_2 100]  
file     [test.c]        [open_dir_2 100]  
file     [New0001.c]        [open_dir_2 100]  
dir      [curl-7.51.0]       [open_dir_2 96]  
file     [test_ftok.c]        [open_dir_2 100]  
file     [log.h]        [open_dir_2 100]  
file     [test_gettimeofday.c]        [open_dir_2 100]  
file     [csdn.c]        [open_dir_2 100]  
file     [client.c]        [open_dir_2 100]  
file     [1.txt]        [open_dir_2 100]  
file     [test_opendir_readdir.c]        [open_dir_2 100]  
file     [curl-7.51.0.tar.gz]        [open_dir_2 100]  
file     [2.txt]        [open_dir_2 100]  
file     [opendir.c]        [open_dir_2 100]  
dir      [zlib-1.2.8]       [open_dir_2 96]  
file     [123.rmvb]        [open_dir_2 100]  
dir      [ffmpeg_learn]       [open_dir_2 96]  
file     [test_sem.c]        [open_dir_2 100]  
file     [test_list.c]        [open_dir_2 100]  
file     [list.h]        [open_dir_2 100]  
file     [server]        [open_dir_2 100]  
dir      [ProFFmpeg]       [open_dir_2 96]  
dir      [ffmpeg-3.1.6]       [open_dir_2 96]  
dir      [yasm-1.3.0]       [open_dir_2 96]  
file     [New0003.c]        [open_dir_2 100]  
dir      [.]       [open_dir_2 96]  
dir      [..]       [open_dir_2 96]  
file     [ffmpeg-3.1.6.tar.gz]        [open_dir_2 100]  
file     [types.h]        [open_dir_2 100]  
file     [New0002.c]        [open_dir_2 100]  
file     [simple.out]        [open_dir_2 100]  
file     [server.c]        [open_dir_2 100]  
dir      [learn]       [open_dir_2 96]  
file     [simple_ffmpeg_player.c]        [open_dir_2 100]  
file     [client]        [open_dir_2 100]  
dir      [abc]       [open_dir_2 96]  
file     [yasm-1.3.0.tar.gz]        [open_dir_2 100]  
file     [output.yuv]        [open_dir_2 100]  
file     [mySDLFirst.out]        [open_dir_2 100]  
-++--+++--[main 118]  
root@ubuntu:/share# 


原创粉丝点击