访问目录
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;
}
代码运行结果如下: