4.文件操作
文件操作
一、VFS
VFS——Virtual File System——虚拟文件系统
df——查看文件系统
linux主要特征:一切皆文件,通过VFS来实现
vfs虚拟文件系统中实现了一个内核文件结构数组,会根据文件的不同类型索引到不同的文件操作上
二、查看文件信息
1.stat
stat 文件名
2.stat 结构及stat函数
struct stat buff;
int stat(const char* file_name,struct stat *buff);
#include<stdio.h>
#include<stdlib.h>
#include<error.h>
#include<sys/types.h>
#include<sys/stat.h>
#define N_BITS 3
int main(int argc,char *argv[])//参数个数 参数
{
int main(int argc,char *argv[])//表示文件权限
struct stat buff;//用来描述linux文件系统的文件属性结构,stat.h
static char *perm = {"---","--x","-w-","-wx","r--","r-x","rwx"};//对应着不同的文件属性
if(argc>1)//argc是命令行参数个数
{
if((stat(argv[1],&buff)!=-1))//通过这个路径得到信息在文件里面
{
printf("test is %s\t",argv[1]);
}
return 0;
}
}
三、文件查看
1.find 查看目录 -name 文件名
find ./test01/ -name hello
如果不知道名字,可以用"*"通配符,匹配任意字符,"?"匹配任意一个字符
find ./ -name a.txt
//表示查看当前目录下a.txt这个文件在哪个子目录下面
find ./ -name *.*
//表示查看当前目录下的子目录中所有的文件
2.find 查找目录 -size 大小
find ./ -size +1k //+1k表示大于1k的文件
find ./ -size +1k -size -2M //表示查找当前目录下大于1k小于2M的文件
3.find 查找目录 -type d/f d——directory 目录
find ./ -type f //表示查看当前目录下所有普通文件
find ./ -type d //表示查看当前目录下所有目录
//也可以混合使用
//find ./ -type f -name b.* 表示查找当前文件下叫b.*的普通文件
4.grep -r "查找的内容" 查找路径
grep -r "print" ./ //表示在当前目录下查找包含字符串“print”的文件
四、文件压缩与解压
1.文件压缩与解压
1.gzip 文件名
表示:压缩
注意:不能压缩目录
2.gunzip 文件名.gz
表示解压
3.bzip2 文件名
表示:压缩
注意:不能压缩目录
4.bunzip2 文件名.bz2
表示:解压
//bzip2 -k a.txt
表示将a.txt压缩的同时也保留了a.txt这个原文件,如果要解压的话需要把a.txt.bz2移动到其他目录再来解压,不然就不能解压,因为不能有两个一样的a.txt文件
gzip -k a.txt //压缩a.txt形成a.txt.gz压缩文件,并保留原文件
gedit a.txt //修改a.txt原文件
gunzip -f a.txt.gz //解压a.txt,并且将修改后的a.txt文件里面的内容覆盖掉
2.目录压缩与解压
1.zip 压缩包名字 压缩文件名 -r 压缩目录名 //压缩之后原目录依然存在
zip test a.txt b.txt -r abc1 abc2
2.unzip 压缩包名字 //解压
unzip test -d 目录名 //表示把test压缩包解压到目录名下的文件内
五、文件缓冲区
1.文件操作缓冲区
缓冲区:内存空间的一部分,在内存空间中预留了一定的存储空间,用来缓冲输入输出的数据的
从磁盘中读取信息,先将信息读取到缓冲区中,计算机再从缓冲区读取数据,再去磁盘中读取,可以加减少磁盘的读写次数【磁盘是有读写寿命的】
因为输入数据的时候是人为输入的,而这些数据是CPU在处理,CPU处理数据的速度很快,所以需要先将数据放到缓冲区中,输入完之后再由CPU统一处理。
1.stdin 标准输入 句柄:0
2.stdout 标准输出 句柄:1
3.stderr 标准错误 句柄:2
2.三种缓冲区
1、全缓冲 _IOFBF
典型代表:对磁盘文件的读写
2、行缓冲 _IOLBF
典型代表:标准输入和标准输出,碰到\n清空缓冲区
3、无缓冲_IONBF
典型代表:标准错误
#include<stdio.h>
#include<error.h>
#include<string.h>
int main(int argc,char **argv)
{
int i;
FILE * fp;//准备一个文件指针
char msg1[]="hello world\n";
char msg2[]="hello\nworld";//两个字符串数组
char buf[128]={};
//"w"——打开文件,如果不存在则创建一个新的文件
if((fp=fopen("no_buff1.txt","w"))==NULL)
{
perror("file open error\n");//如果打开失败则提示
return -1;
}
setbuf(fp,NULL);//设置无缓冲
fwrite(msg1,7,1,fp);//用msg1字符串数组写入7个字符到fp中,写入一次
printf("test setbuff(no buff),check no_buff1.txt\n");
getchar();
fclose(fp);
//无缓冲
if((fp=fopen("no_buff2.txt","w"))==NULL)
{
perror("file open error\n");//如果打开失败则提示
return -1;
}
setvbuf(fp,NULL,_IONBF,0);//fp是使用这个缓冲区,NULL是首地址,_IONBF是无缓冲模式,
fwrite(msg1,7,1,fp);//用msg1字符串数组写入7个字符到fp中
printf("test setbuff(no buff),check no_buff2.txt\n");
getchar();
fclose(fp);
//行缓冲
if((fp=fopen("L_buff.txt","w"))==NULL)//行缓冲
{
perror("file open error\n");//如果打开失败则提示
return -1;
}
setvbuf(fp,buf,_IOLBF,sizeof(buf));
memset(buf,0,128);
fwrite(msg2,sizeof(msg2),1,fp);//将msg2字符串数组全部写入fp中,但是行缓冲遇到\n时会清空缓冲区,所以buf数组里面有“helloworld",但是L_buff.txt中只有hello
printf("test setbuff(line buff),check l_buff1.txt\n");
printf("new buf data is : buf = %s\n",buf);//输出行缓冲
getchar();
fclose(fp);
//全缓冲
if((fp=fopen("F_buff.txt","w"))==NULL)
{
perror("file open error\n");//如果打开失败则提示
return -1;
}
setvbuf(fp,buf,_IOFBF,sizeof(buf));
memset(buf,0,128);
fwrite(msg2,sizeof(msg2),1,fp);//将msg2字符串数组全部写入fp中.
printf("test setbuff(full buff),check F_buff1.txt\n");
printf("new buf data is : buf = %s\n",buf);//输出全缓冲
getchar();
fclose(fp);
//这里执行完fwrite时,只是将msg2里面的内容写到了buf缓冲区里面,只有当执行完fclose时,会清空缓冲区,再将msg2里面的内容写到文件中
//先将数组里面的内容写到buf这个缓冲区里面,再从这个缓冲区中将内容读到文件中
return 0;
}