文件属性stat

stat/fstat

获取文件属性
#include 
int stat(const char* path,struct stat* buf);
//path : 路径 , buf : 属性;

int fstat(int fd,struct stat* buf);
//fd : 文件描述符 , buf : 属性;

struct stat
{
    dev_t     st_dev;     /* ID of device containing file */文件使用的设备号
    ino_t     st_ino;     /* inode number */    索引节点号 
    mode_t    st_mode;    /* protection */  文件对应的模式,文件,目录等
    nlink_t   st_nlink;   /* number of hard links */    文件的硬连接数  
    uid_t     st_uid;     /* user ID of owner */    所有者用户识别号
    gid_t     st_gid;     /* group ID of owner */   组识别号  
    dev_t     st_rdev;    /* device ID (if special file) */ 设备文件的设备号
    off_t     st_size;    /* total size, in bytes */ 以字节为单位的文件容量   
    blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小   
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */ 该文件所占的磁盘块  
    time_t    st_atime;   /* time of last access */ 最后一次访问该文件的时间   
    time_t    st_mtime;   /* time of last modification */ /最后一次修改该文件的时间   
    time_t    st_ctime;   /* time of last status change */ 最后一次改变该文件状态的时间   
};
/*
    S_IFMT   0170000    文件类型的位遮罩
    S_IFSOCK 0140000    套接字
    S_IFLNK 0120000     符号连接
    S_IFREG 0100000     一般文件
    S_IFBLK 0060000     区块装置
    S_IFDIR 0040000     目录
    S_IFCHR 0020000     字符装置
    S_IFIFO 0010000     先进先出
​
    S_ISUID 04000     文件的(set user-id on execution)位
    S_ISGID 02000     文件的(set group-id on execution)位
    S_ISVTX 01000     文件的sticky位
​
    S_IRUSR(S_IREAD) 00400     文件所有者具可读取权限
    S_IWUSR(S_IWRITE)00200     文件所有者具可写入权限
    S_IXUSR(S_IEXEC) 00100     文件所有者具可执行权限
​
    S_IRGRP 00040             用户组具可读取权限
    S_IWGRP 00020             用户组具可写入权限
    S_IXGRP 00010             用户组具可执行权限
​
    S_IROTH 00004             其他用户具可读取权限
    S_IWOTH 00002             其他用户具可写入权限
    S_IXOTH 00001             其他用户具可执行权限
​
    上述的文件类型在POSIX中定义了检查这些类型的宏定义:
    S_ISLNK (st_mode)    判断是否为符号连接
    S_ISREG (st_mode)    是否为一般文件
    S_ISDIR (st_mode)    是否为目录
    S_ISCHR (st_mode)    是否为字符装置文件
    S_ISBLK (s3e)        是否为先进先出
    S_ISSOCK (st_mode)   是否为socket
*/

例子

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


int lsdir(const char *path){
	struct stat st = {};
	int ret = stat(path,&st);	//stat获取文件属性
	if(ret == -1){
		printf("%m\n");
		return -1;
	}
	if(S_ISDIR(st.st_mode)){//通过辅助宏S_ISDIR()判断是否为目录
		DIR *dir = opendir(path);//通过函数接口opendif()获取目录流
		if(dir == NULL){
			printf("open %s failed! %m\n",path);
			return -1;
		}
		struct dirent *pd = NULL;
		int i = 0;
		while((pd = readdir(dir)) != NULL){//讲获取的目录流进行读取
			printf("%-28s ",pd->d_name); //打印文件名
			++i;
			if(i%2==0)
				printf("\n");
		}
		printf("\n");
		closedir(dir);
	}else{
		printf("%s not a dirent!\n",path);
		return -1;
	}
}

int main(int argc,char *argv[]){
	if(argc < 2){	//lsdir test.txt
		printf("%s dirname\n",argv[0]);		
		return -1;
	}
	lsdir(argv[1]);
	return 0;	
}


你可能感兴趣的:(linux,文件系统)