访问目录
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; //用户IDgid_t st_gid; //组IDoff_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;
}
代码运行结果如下: