zoukankan      html  css  js  c++  java
  • 文件流FileStream

    文件流FileStream

    文件流其实就是字节流.

    ■Read方法和Write方法

    ■构造方法的参数列表:

      第一个为要读取或要写入的文件路径.

      第二个为FileMode:Open,Creat,CreatOrOpen,Append,Truncate.

      第三个为FileAccess:write,Read,ReadWrite

    class Program
        {
            static void Main(string[] args)
            {
                FileStream f = new FileStream(@"D:1.txt", FileMode.Open, FileAccess.Read);
                FileStream f2 = new FileStream(@"D:写进来的.txt", FileMode.Create, FileAccess.Write);
                byte[] bs = new byte[10];
                using (f)
                {
                    using (f2)
                    {
                        int num;
                        do 
                        {
                           num = f.Read(bs, 0, bs.Length);
                           //f2.Write(bs, 0, bs.Length);某些情况会和容易出现错误
                           f2.Write(bs, 0, num);
                        } while (num!=0);
                    }
                }
            }
        }

    代码中,和f2.Write(bs,0,bs.Length)会有出错的情况:

    例子:

     文件1.txt里面的内容为"翟 群"

    下面我们对1.txt进行复制,见代码:

    FileStream f1=new FileStream("D:\1.txt",FileMode.Open,FileAccess.Read);
    FileStream f2=new FileStream("D:\1.txt",FileMode.Open,FileAccess.Write);
    using(f1){
        using(f2){
            byte[] bs=new byte[4];
            int mun;
            do{
             num=f1.Read(bs,0,bs.Length);
             f2.Write(bs,0,bs.Length);
            }while(num!=0) 
        }
    }

     所以产生乱码:

    正确是读写图解:

    文件加密:

    class Program
        {
            static void Main(string[] args)
            {
                FileStream f = new FileStream("d:\1.txt", FileMode.Open, FileAccess.Read);
                FileStream f1 = new FileStream("d:\加密文件", FileMode.Create, FileAccess.Write);
                using (f)
                {
                    using (f1)
                    {
                        byte[] bs = new byte[10];
                        int num;
                        do 
                        {
                            //有一个字节流,我们将字节流原封不动的写进入新文件,则表示copy
                            //如果要加密,需要一个秘钥,咱就把它设为1.在每一个字节数上加1
                            num = f.Read(bs, 0, bs.Length);
                            for (int i = 0; i < bs.Length;i++ )//进行加密
                            {
                                //bs[i]=(byte)(bs[i]+1);
                                bs[i]++;
                            }
                            f1.Write(bs, 0, num);
                        } while (num!=0);
                    }
                }
                FileStream f2 = new FileStream("D:\加密文件", FileMode.Open, FileAccess.Read);
                FileStream f3 = new FileStream("D:\解密文件", FileMode.Create, FileAccess.Write);
                using (f2)
                {
                    using (f3)
                    {
                        byte[] b=new byte[10];
                        int count;
                        do
                        {
                            count = f2.Read(b, 0, b.Length);
                            for (int i = 0; i < b.Length;i++ )
                            {
                                b[i]--;//因为加密的时候对每个字节加了1,所以解密就是将每个字节减去1就得到了原来的数据
                            }
                            f3.Write(b, 0, count);
                        } while (count!=0);
                    }
                }
            }
        }

     ■ReadByte()和WriteByte()方法。返回读取到的二进制数据对应的Ascil码。

    下面代码用ReadByte()和WriteByte()方法来实现文件加密,解密

     static void Main(string[] args)
            {
                Console.WriteLine("请输入要加密的文件");
                string file = Console.ReadLine();
                //File.Exist()判断文件是否存在,如果存在返回true,否则返回false
                if (!System.IO.File.Exists(file))
                {
                    Console.WriteLine("输入的文件不存在");
                    Console.ReadKey();
                    return;//程序结束
                }
                //要进行加密,可以考虑生成一个新文件,名字相同,加上后缀
                //D:1.txt ->D:1_加密.txt
                string newfile = file.Insert(file.LastIndexOf('.'), "_加密");
                FileStream fileReader = new FileStream(file, FileMode.Open, FileAccess.Read);
                FileStream fileWriter = new FileStream(newfile, FileMode.Create, FileAccess.Write);
                using (fileReader)
                {
                    using (fileWriter)
                    {
                        int res = -1;
                        while ((res = fileReader.ReadByte()) != -1)//ReadByte()返回读到的二进制数据对应的Ascil码
                        {
                            res = 255 - res;
                            fileWriter.WriteByte((byte)res);
                        }
                    }
                    Console.WriteLine("ok");
                    Console.WriteLine("按任意键盘解密");
                    Console.ReadKey();
                    string newfile1 = file.Insert(file.LastIndexOf('.'), "_解密");
                    FileStream fr = new FileStream(newfile, FileMode.Open, FileAccess.Read);
                    FileStream fw = new FileStream(newfile1, FileMode.Create, FileAccess.Write);
                    using (fr)
                    {
                        using (fw)
                        {
                            int res = -1;
                            while ((res = fr.ReadByte())!= -1)
                            {
                                res = 255 - res;
                                fw.WriteByte((byte)res);
                            }
                        }
                    }
                    Console.WriteLine("ok");
                    Console.ReadKey();
                }
    
    
            }
    View Code
  • 相关阅读:
    C语言编译包含math库加参数-lm
    C语言浮点类型有效位(float, double,long double)
    C语言速记(宏)
    C语言速记6(结构体)
    asp.net Core依赖注入汇总
    跨域请求(转载)
    UnobtrusiveJavaScriptEnabled、ClientValidationEnabled(转载)
    到值类型“System.DateTime”的强制转换失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可以为 null 的类型。
    软件开发PPT中造图片软件:ProcessOn
    EF接收数据通用实体模型
  • 原文地址:https://www.cnblogs.com/tobecabbage/p/3491159.html
Copyright © 2011-2022 走看看