一。文件操作函数
1.stat函数
1.1 stat记录了文件的信息
1.2 st_mode由16位二进制数组成,如下图:
下图表示各种文件类型对应的8进制数,将st_mode&0170000可以得到文件类型,若要判断一个文件是不是普通文件:
struct stat st;
stat("123.txt",&st);
if((st.st_mode&S_IFMT)==S_IFREG)
{
printf(“这是普通文件”);
}
1.3计算文件的权限类型如下图:
另外可以参考:https://blog.csdn.net/astrotycoon/article/details/8679676
2.lstat函数
3.chmod
4.chown
uid和gid在vi /etc/passwd中可以查看
5.truncate
6.link
7.rename
8.dup dup2
用来复制文件描述符
函数原型:
1.dup将oldfd复制为最小可用的文件描述符,并返回
示例程序:通过fd和ret文件描述符都可以往文件a.txt中写数据,并且文件指针不会还原。
2.dup2将oldfd复制为newfd
示例程序:将原本“english.txt”的文件描述符fd复制为fd1,即a.txt的文件描述符,并往a.txt中写数据
9.fcntl
cmd传入F_GETFL时获取文件状态,arg=0;
cmd传入F_SETFL时设置文件状态,arg=flag;
二.目录操作函数
1.chdir 和 getcwd
2.mkdir 和 rmdir
3.opendir
4.readdir
//递归读取子目录并计算普通文件个数
#include<stdio.h> #include<stdlib.h> #include<dirent> int getFileNum(const char *filename) { DIR *dir=NULL; dir=opendir(filename); struct dirent* ptr=NULL; if(dir==NULL) { perror("opendir"); exit(1); } char path[1024]={0}; while((ptr=readdir(dir))!=null) { //过滤.和.. if(strcmp(ptr->d_name,".")==0||strcmp(ptr->d_name,"..")==0) { continue; } //如果是目录 if(ptr->d_type==DT_DIR) { sprintf(path,"%s%s",filename,ptr->d_name); //递归读目录 total+=getFileNum(path); } //如果是普通文件 if(ptr->d_type==DT_REG) { total++; } } closedir(dir); return total; } int main(int argc,char* argv[]) { int total=getFileNum(argv[1]); printf("%s has file numbers %d",argv[1],total); return 0; }