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;
    }
    
  • 相关阅读:
    C#深入浅出 修饰符(二)
    HDU 5785 Interesting
    HDU 5783 Divide the Sequence
    HDU 5781 ATM Mechine
    UVA 714 Copying Books
    uva 1471 Defense Lines
    UVA 11134 Fabled Rooks
    UVA 11572 Unique Snowflakes
    UVA 11093 Just Finish it up
    UVA 10954 Add All
  • 原文地址:https://www.cnblogs.com/Kissfly123/p/15270063.html
Copyright © 2011-2022 走看看