关于三个结构体的定义:

http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/

DIR结构体的定义:

<span style="font-family:SimSun;font-size:12px;">struct __dirstream   
   {   
    void *__fd;    
    char *__data;    
    int __entry_data;    
    char *__ptr;    
    int __entry_ptr;    
    size_t __allocation;    
    size_t __size;    
    __libc_lock_define (, __lock)    
   };   
  
typedef struct __dirstream DIR;  </span>

dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:

<span style="font-family:SimSun;font-size:12px;">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字符 */  
}  </span>

通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数

int stat(const char *file_name, struct stat *buf);

的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:

<span style="font-family:SimSun;font-size:12px;">struct stat {   
        mode_t     st_mode;       //文件访问权限   
        ino_t      st_ino;       //索引节点号   
        dev_t      st_dev;        //文件使用的设备号   
        dev_t      st_rdev;       //设备文件的设备号   
        nlink_t    st_nlink;      //文件的硬连接数   
        uid_t      st_uid;        //所有者用户识别号   
        gid_t      st_gid;        //组识别号   
        off_t      st_size;       //以字节为单位的文件容量   
        time_t     st_atime;      //最后一次访问该文件的时间   
        time_t     st_mtime;      //最后一次修改该文件的时间   
        time_t     st_ctime;      //最后一次改变该文件状态的时间   
        blksize_t st_blksize;    //包含该文件的磁盘块的大小   
        blkcnt_t   st_blocks;     //该文件所占的磁盘块   
      };  </span>

#include <iostream>
#include <sys/types.h>
#include <dirent.h>
using namespace std;
int main(int argc , char **argv) 
{ 
	DIR *dirp; 
	int num=0; 

	dirp = opendir(argv[1]); 
	while(dirp) { 
	if(readdir(dirp) != NULL) 
		++num; 
	else 
	break; 
	} 
	closedir(dirp); 
	cout<<num<<endl;
}

建立一个空文件夹,输出问2,其中包含 .  和 ..两个文件

touch一个空文件,输出为3.




Logo

更多推荐