目录
- 文件属性操作函数
- access函数
- chmod函数
- chown函数
- truncate函数
- 目录操作函数
- mkdir函数
- rmdir函数
- rename函数
- chdir函数
- *getcwd函数
- 目录遍历函数
- *opendir函数
- *readdir函数
- closedir函数
- dup、dup2函数
- dup
- dup2
- fcntl函数
文件属性操作函数
access函数
判断某个文件是否有某个权限,或者判断文件是否存在
#include <unistd.h>
#include <stdio.h>int main(){int ret = access("a.txt",F_OK);if(ret==-1){perror("access");}printf("文件存在!!\n");return 0;
}
chmod函数
修改文件的权限
#include<sys/stat.h>
#include<stdio.h>int main(){int ret=chmod("a.txt",0777);if(ret==-1){perror("chmod");return -1;}return 0;
}
修改权限之后,文件权限改变了
chown函数
改变文件所在组
truncate函数
缩减或者扩展文件的尺寸至指定的大小
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>int main(){int ret=truncate("a.txt",5);if(ret==-1){perror("truncate");return -1;}return 0;
}
a.txt大小扩展到20个字节
缩减到5个字节的话,会把后面超出部分直接删除
目录操作函数
mkdir函数
生成一个目录
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>int main(){int ret =mkdir("aaa",0777);if(ret==-1){perror("mkdir");return -1;}return 0;
}
最终的权限会与umask进行一个&,抹除部分权限
rmdir函数
删除一个目录,只能删除框目录,如果有内容的话,要先把内容删掉,然后再调用这个函数
rename函数
修改目录的名字
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>int main(){int ret =rename("aaa","bbb");if(ret==-1){perror("rename");return -1;}return 0;
}
aaa变成了bbb
chdir函数
修改进程的当前工作目录
*getcwd函数
获取当前的工作路径
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>int main(){//获取当前的工作目录char buf[128];getcwd(buf,sizeof(buf));printf("当前的工作目录是:%s\n",buf);//修改工作目录int ret=chdir("/home/nowcoder/Linux/lesson13");if(ret==-1){perror("chdir");return -1;}//创建一个新的文件int fd=open("chdir.txt",O_CREAT | O_RDWR,0664);if(fd==-1){perror("open");return -1;}//获取当前的工作目录char buf1[128];getcwd(buf1,sizeof(buf1));printf("当前的工作目录是:%s\n",buf1);return 0;
}
改变工作路径之后,创建文件在新的工作路径下
目录遍历函数
*opendir函数
*readdir函数
读取目录中的数据
closedir函数
关闭目录
#define _DEFAULT_SOURCE
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include <stdlib.h>
int getFileNum(const char * path);//读取某个目录下所有普通文件的个数
int main(int argc, char * argv[]){if(argc<2){printf("%s path\n",argv[0]);return -1;}int num=getFileNum(argv[1]);printf("普通文件的个数为:%d\n",num);return 0;
}
//用于获取目录下所有普通文件的个数
int getFileNum(const char * path){//1.打开目录DIR * dir=opendir(path);if(dir==NULL){perror("opendir");exit(0);}struct dirent * ptr;//记录普通文件的个数int total=0;while((ptr=readdir(dir))!=NULL){//获取名称char * dname=ptr->d_name;//忽略掉.和..if(strcmp(dname,".")==0||strcmp(dname,"..")==0){continue;}//判断是否是普通文件if(ptr->d_type==DT_DIR){//目录,需要继续读取这个目录char newpath[256];sprintf(newpath,"%s/%s",path,dname);total+=getFileNum(newpath);}if(ptr->d_type==DT_REG){total++;}}//关闭目录closedir(dir);return total;
}
dup、dup2函数
dup
复制文件描述符,新的文件描述符和旧的指向同一个文件,多个文件描述符可以指向同一个文件
#define _DEFAULT_SOURCE
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include <stdlib.h>
#include<unistd.h>int main(){int fd = open("a.txt",O_RDWR | O_CREAT,0664);int fd1=dup(fd);if(fd1==-1){perror("dup");return -1;}printf("fd :%d,fd1:%d\n",fd,fd1);close(fd);char * str="hello,world";int ret=write(fd1,str,strlen(str));if(ret==-1){perror("write");return -1;}close(fd1);return 0;
}
会从空闲中找一个最小的文件描述符用
dup2
重定向文件描述符
#define _DEFAULT_SOURCE
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include <stdlib.h>
#include<unistd.h>int main(){int fd=open("1.txt",O_RDWR | O_CREAT,0664);if(fd==-1){perror("open");return -1;}int fd1=open("2.txt",O_RDWR | O_CREAT,0664);if(fd1==-1){perror("open");return -1;}printf("fd:%d,fd1:%d\n",fd,fd1);int fd2=dup2(fd,fd1);if(fd2==-1){perror("dup2");return -1;}//通过fd1去写数据,实际操作的是1.txt,而不是2.txtchar * str ="Hello,dup2";int len=write(fd1,str,strlen(str));if(len==-1){perror("write");return -1;}printf("fd:%d,fd1:%d,fd2:%d\n",fd,fd1,fd2);close(fd);close(fd1);return 0;
}
fcntl函数
复制文件描述符
设置/获取文件的状态标志
#define _DEFAULT_SOURCE
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include <stdlib.h>
#include<unistd.h>int main(){//复制文件描述符//int fd=open("1.txt",O_RDONLY);//int ret=fcntl(fd,F_DUPFD);//修改或者获取文件状态的flagint fd=open("1.txt",O_RDWR);if(fd==-1){perror("open");return -1;}//获取文件描述符状态FLAGint flag=fcntl(fd,F_GETFL);flag |=O_APPEND;//修改文件描述符状态的flag,给flag加入O_APPENDint ret=fcntl(fd,F_SETFL,flag);if(ret==-1){perror("fcntl");return -1;}char * str="nihao";write(fd,str,strlen(str));close(fd);return 0;
}
内容已经被追加到文件中