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	",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

典型代表:标准输入和标准输出,碰到 清空缓冲区

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
";
    char msg2[]="hello
world";//两个字符串数组
    char buf[128]={};
    
    //"w"——打开文件,如果不存在则创建一个新的文件
    if((fp=fopen("no_buff1.txt","w"))==NULL)
    {
        perror("file open error
");//如果打开失败则提示
        return -1;
    }
    setbuf(fp,NULL);//设置无缓冲
    fwrite(msg1,7,1,fp);//用msg1字符串数组写入7个字符到fp中,写入一次
    printf("test setbuff(no buff),check no_buff1.txt
");
    getchar();
    fclose(fp);
    
    
    //无缓冲
      if((fp=fopen("no_buff2.txt","w"))==NULL)
    {
        perror("file open error
");//如果打开失败则提示
        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
");
    getchar();
    fclose(fp);
    
    //行缓冲
      if((fp=fopen("L_buff.txt","w"))==NULL)//行缓冲
    {
        perror("file open error
");//如果打开失败则提示
        return -1;
    }
    setvbuf(fp,buf,_IOLBF,sizeof(buf));
    memset(buf,0,128);
    fwrite(msg2,sizeof(msg2),1,fp);//将msg2字符串数组全部写入fp中,但是行缓冲遇到
时会清空缓冲区,所以buf数组里面有“helloworld",但是L_buff.txt中只有hello
    printf("test setbuff(line buff),check l_buff1.txt
");
    printf("new buf data is : buf = %s
",buf);//输出行缓冲
    getchar();
    fclose(fp);
    
    //全缓冲
     if((fp=fopen("F_buff.txt","w"))==NULL)
    {
        perror("file open error
");//如果打开失败则提示
        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
");
    printf("new buf data is : buf = %s
",buf);//输出全缓冲
    getchar();
    fclose(fp);
    //这里执行完fwrite时,只是将msg2里面的内容写到了buf缓冲区里面,只有当执行完fclose时,会清空缓冲区,再将msg2里面的内容写到文件中
    
    //先将数组里面的内容写到buf这个缓冲区里面,再从这个缓冲区中将内容读到文件中
    
    return 0;
}
原文地址:https://www.cnblogs.com/Kissfly123/p/15270063.html