自学内容网 自学内容网

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;
}

代码运行结果如下:


原文地址:https://blog.csdn.net/Fresh_man111/article/details/142497484

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!