第九天

来源:互联网 发布:linux驱动框架 编辑:程序博客网 时间:2024/04/29 06:14

传智博客。传智博客老师今天又开始教文件操作多线程,讲了,

递归加载目录树、文件流读写操、大文件拷贝、Using的本质、文件流补充、序列化与反序列化


文件操作多线程

using管理的对象 一处using块 就会自动调用这个对象的Dispose方法

 

如果类的对象要被using管理 这个对象的类必须实现IDisposeable接口.

 

using的本质其实就是1try-finally using中的代码生成在了try调用该对象的Dispose方法写在了finally

所以Dispose方法无论如何都会调用.

 

2.序列化

 

 需要将对象的状态保存起来

 序列化:  将对象的状态持久化到某一种设备上(磁盘)

 要将类标记为Serializable 这个类的对象才可以被序列化

 以二进制的方式序列化,而不是文本文档.

 反序列化.将之前序列化的文件还原为对象 

 

 

1.将指定路径的文本文件内容,读取到文本框中。

 

private void button1_Click(object sender,EvenArgs e)

{

      //1. 创建1个文件流对象并给这个文件流对象指定操作的文件(路径还有指定操作的方式

      FileStream stream = new FileStream(@"H:\1.txt",FileMode.Open);

      //2. 准备1byte数组 以供文件流对象读取数据并放到这个数组里面.

      byte[] buffer = new byte[1024*1024];

      //3. 调用文件流的读数据方法 将读出来的字节放入到buffer数组中.

      stream.Read(buffer,0,buffer.Length);

      //4. 将字节数组以指定的编码转换为字符串

      string content = Encoding.Default.GetString(buffer);

      textBox1.text = content;

       //5.关闭文件流

      stream.Dispose();

           

}

 

2.将文本框的内容读取到保存的文本中。

private void button2_Click(object sender,EvenArgs e)

{

      SaveFileDialog sfd = new SaveFileDialog();

      DialogResult res = sfd.ShowDialog();       //DialogResult 定义一个通用对话框返回值的变量

      if(res == System.Windows.Forms.FialogResult.OK)

      {

          //1. 创建文件流对象 

          FileStream stream = new FileStream(sfd.FileName,FileMode.Create);

          //2. 调用文件流写入的方法.

          string content =textBox1.Text;

          //3. 将字符串以指定的编码转换为字节数组.(二进制)

          byte[] buffer =Encoding.UTF8.GetBytes(content);

          //调用文件流对象的写入方法

          stream.Write(buffer,0,buffer.Length);

          stream.Dispose();

      }

}

 

 

3.将一个文件里的内容拷贝到另一个文件里。

private void button3_Click(object sender,EvenArgs e)

{

     //1. 准备个用于读数据的文件流

     using(FileStream streamReader = new FileStream(@"H:\1.txt",FileMode.Open));

     {

          //2. 准备1个用于写数据的文件流

          using(FileStream streamWriter = new FileStream(@"H:\2.txt",FileMode.Create));

          {

             //3. 准备1个字节数组用于保存读出来的数据

             byte[] data = new byte[1024*1024]    

             //4. 用读的文件流将数据读出来 放到字节数组中.

             int length = 0;

             do

             {

                 length = streamReader.Read(data,0,data.Length)

                 streamWrite.Write(data,0,length);

              }while(length>=data.Length);

              //5. 调用写的文件流将字节数组写入.

              //6. 关闭文件流

              MessageBox.Show("操作成功");

           }

      }

}

 

4.

            //using管理的对象 一处using块 就会自动调用这个对象的Dispose方法

            //如果类的对象要被using管理 这个对象的类必须IDisposeable接口.

            //using的本质其实就是1try-finally using中的代码生成在了try调用该对象的Dispose方法写在了finally

            //所以Dispose方法无论如何都会调用.

private void button4_Click(objectt sender,EvenArgs e)

{

   byte[] buffer = new byte[1024*1024];

   stream.Read(buffer,0,buffer,Length);

   stream.Dispose();

}

 

5.序列化和反序列化(二级制)

[Serializable]//指定一个类,可以被序列化,此类不能被继承。

class Person

{

   public int Age{get;set;}

   public string Name{ get;set;}

}

 

class Program

{

    static void Main(string[] args)

    {

         Create();

         Read();

     }

    public void Create()

    {

        Person p = new Person(){Age = 12,Name="rose"};

       System.Runtime.Serialization.Formatters.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.BinaryFormatter();

       using(FileStream fs = new FileStream("se.bin",FileMode.Create))

      {

        bf.Serialize(fs,p);

       }

     }

    

    public void Read()

     {

       System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

       using(FileStream fs = new FileStream("se.bin",FileMode.Open))

        {

            object obj = bf.Deserialize(fs);

            Person p = obj as Person;

            Console.WriteLine(p.Name + ":" +p.Age);

         }

     }

}

 

6.建立目录

namespace A

{

    public partial class Form1 : Form

    {

        string path = @"H:\1";

        public Form1()//设计器支持所需要的方法

        {

           InitializeComponent();

        }

        

        private void Form1_Load(object sender,EventArgs e)

        {

             LoadTree(path,null);

         }

        

        private void LoadTree(string path,TreeNode node)

        {

           //判断1node是不是null 如果是null代表要将指定目录下的所有的子目录直接加到TreeView

           //将指定路径下的所有的子目录

           string[] dirs = Directory.GetDirectories(path);

           //遍历

           foreach(string dir in dirs)

          {

             TreeNode node1 = new TreeNode(Path.GetFileName(dir));

             if(node==null)

             {

              // 如果是null代表要将指定目录下的所有的子目录直接加到TreeView下 

               TreeView .Nodes.Add(node1);

              }

             else//如果不是null 就将节点加载到传进来的节点下面.

             {

                node.Nodes.Add(node1);

             }

             if(Directory.GetDirectories(dir).Length>0)//判断当前遍历到的目录下面是否还有子目录.

              {

                   //如果有 递归调用将当前遍历到的目录下的子目录加载到当前节点下.

                   node.Nodes.Add(node1);

                }

           }

         }

     }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0