zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    2
    作业5
    实验十
    作业 5 指针应用
    九九乘法表
    实验七(课堂练习)
    实验六 数组 (2)
    实验六 数组
    课堂实验5(求从m到n之间(包括m和n)所有素数的和)
    课堂实验5-2
  • 原文地址:https://www.cnblogs.com/Kissfly123/p/15270063.html
Copyright © 2011-2022 走看看