9.4 Linux_I/O_访问目录、文件属性

访问目录

1、打开关闭目录

打开目录函数声明如下:

//1.直接打开指定路径的目录文件
DIR *opendir(const char *name);
//2.先用open打开目录文件,再用该函数访问目录文件
DIR *fdopendir(int fd);

返回值:成功返回指向打开的目录文件的结构体指针(流指针),失败返回NULL

name:目录的路径

fd:文件描述符

关闭目录函数声明如下:

int closedir(DIR *dirp);

返回值:成功返回0,失败返回EOF

dirp:指向目录的流指针

2、读目录

函数声明如下:

struct dirent *readdir(DIR *dirp);

返回值:失败或读到末尾返回NULL,成功可以通过结构体读取目录内容,类似 ls-a 效果

dirp:指向目录的流指针

实现 ls -a 效果代码:

具体代码实现如下:

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

int main(){
	
	DIR* dp = NULL;
	struct dirent* dt = NULL;
	//1.打开目录
	if((dp = opendir("../linux_test")) == NULL){
		perror("opendir");
		return -1;
	}
	//2.获取并打印目录中的文件名
	while(1){
		dt = readdir(dp);//读取目录信息
		if(dt == NULL){
			break;
		}else{
			printf("%s ",dt->d_name);//dt的d_name代表文件名,依次读取即可
		}
	}
	puts("");
	//3.关闭目录
	closedir(dp);
	return 0;
}

代码执行结果如下:

文件属性

1、修改文件权限

函数声明如下:

//直接通过文件路径,修改指定文件的权限
int chmod(const char *pathname, mode_t mode);

//先通过open打开文件,再通过fd修改指定文件权限
int fchmod(int fd, mode_t mode);

返回值:成功返回0,失败返回EOF

pathname:文件的路径

fd:文件描述符

mode:权限,与命令chmod的使用方式完全一致。

示例代码如下:

具体代码实现如下:

#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>

int main(){
	if(chmod("./file",0444) == EOF){
		perror("chmod");
		return -1;
	}
	return 0;
}

代码执行结果如下:

2、获取文件的属性

函数声明如下:

//当为链接文件时,获取目标的文件属性
int stat(const char *pathname, struct stat *statbuf);
//需要先用open打开文件,再调用该函数,作用与stat一样
int fstat(int fd, struct stat *statbuf);

//当为链接文件时,获取链接文件自身的文件属性
int lstat(const char *pathname, struct stat *statbuf);

返回值:成功返回0,失败返回EOF

pathname:文件的路径

fd:文件描述符

statbuf:存放文件属性的结构体

struct stat 结构体中所关注的成员如下:

struct stat {
    mode_t st_mode;   //文件的类型和存储的权限
    uid_t  st_uid;    //用户ID
    gid_t  st_gid;    //组ID
    off_t  st_size;   //文件的大小       
    time_t st_atime;  //最后一次访问的时间
    time_t st_mtime;  //最后一次修改的时间
    time_t st_ctime;  //最后一次改变属性的时间
    .....             //其他的一些成员
}

文件类型相关宏如下:

使用方法为,将struct stat结构体的成员st_mode传入宏,如果是相应的文件类型则返回1

S_ISREG(st_mode)    //是否为常规文件
S_ISDIR(st_mode)    //是否为目录文件
S_ISCHR(st_mode)    //是否为字符文件
S_ISBLK(st_mode)    //是否为块文件
S_ISFIFO(st_mode)   //是否为管道文件
S_ISLNK(st_mode)    //是否为链接文件
S_ISSOCK(st_mode)   //是否为套接字文件

文件权限获取方式如下:

struct stat结构体的成员st_mode的低9位代表文件的权限,bit8~bit0分别表示用户、用户组、其他用户的rwx权限,当位的值为1时,代表有权限,具体含义如下:

使用 stat 实现 ls -l 功能:

具体代码实现如下:

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
int main(){
	struct stat buf;
	int i;
	struct tm* tTime = NULL;
	//1.stat获取文件属性
	if(stat("./file",&buf) == EOF){
		perror("stat");
		return -1;
	}
	//2.访问文件属性
	//2.1 打印文件大小
	printf("file size = %ld\n",buf.st_size);
	//2.2 打印文件类型
	if(S_ISREG(buf.st_mode)){ 				
		printf("this is regular file\n");
	}
	//2.3 打印文件权限
	printf("文件的权限为:");
	for(i=8;i>=0;i--){
		if(buf.st_mode & (0x01<<i)){
			switch(i%3){
				case 0:
					printf("x");
					break;
				case 1:
					printf("w");
					break;
				case 2:
					printf("r");
					break;
			}
		}else{
			printf("-");
		}
	}
	puts("");
	//2.4 打印文件时间
	tTime = localtime(&buf.st_atime);
	printf("文件的最后一次访问时间为:%d年%02d月%02d日,星期%d,%02d:%02d:%02d\n",\
			tTime->tm_year + 1900, \
			tTime->tm_mon + 1, \
			tTime->tm_mday, \
			tTime->tm_wday, \
			tTime->tm_hour, \
			tTime->tm_min, \
			tTime->tm_sec \
			);
	return 0;
}

代码运行结果如下:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值