zoukankan      html  css  js  c++  java
  • 第一个文件读写的例子

    首先,我们打开VS2013,新建一个窗体应用程序如图:

    需求:我们要实现这样的功能,点击文本框,然后弹出文件对话框,让我们选择文件,然后点击确定之后,读取指定文件的内容,随后我们将读取到的数据,写入文本中。

    文件读写原理:前面,我们在学习文件读写原理的时候,已经知道,硬盘的数据和内存之间的关系,在磁盘中,我们将数据读取成二进制的数据,存放到byte数组中,然后在内存中,我们需要将byte数组转化为原始的文本数据。

    然后看下截图的代码:

    我们通过OpenFileDialog类,来创建一个对话框。通过其实例对象的ShowDialog方法,来显示对话框,这个方法的返回值是DialogResult类型。图中的代码意思是:当我们打开对话框,点击确定之后,显示所选的文件的全路径。

    代码这样写,通过filenames也可以达到一样的效果:看图:

    现在我们已经达到了这样的效果,显示了文件的路径,然后现在我们要点击读取按钮,把所选的文件文件,数据读取到另一个文件中。

    我们测试的文本是:

    可以看到这个文本是293个字节:(在代码中,我们创建数组的时候,怎么知道创建的多大的呢??)

    这里有个技巧:

    先读取传过来的文本的路径,在文件流中的length属性就标志了,我们需要读取的文件的大小。我们就可以知道要创建的数组的大小了。

    所有的代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace FileReadDemo
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void txtPath_Click(object sender, EventArgs e)
            {
                //文件打开对话框
                OpenFileDialog openDialog = new OpenFileDialog();
    
                //显示对话框的方法。返回值是DialogResult类型
                //openDialog.ShowDialog();
                if (openDialog.ShowDialog() == DialogResult.OK)
                {
                   
                        txtPath.Text = openDialog.FileName;   //获取全路径
                   
                        
                }
    
            }
    
            private void btnRead_Click(object sender, EventArgs e)
            {
                //1.读取文件的话,我们需要使用文件的读写类,这里使用FileStream类,引用命令空间System.IO.
                //读文件,模式选择Open
                FileStream fileRead = new FileStream(txtPath.Text, FileMode.Open);
    
                //创建byte类型的数组(注意这个时候,有个疑问了,数组大小应该创建多大的呢?)
                byte[] fileByte = new byte[fileRead.Length];
                
                //2.将文件中所指定的数据读取到数组中
                fileRead.Read(fileByte, 0, fileByte.Length);
    
                //现在已经按照文件读写原理,把磁盘的数据转为二进制,存到数组了,现在需要写入到文件中
                //但FileStream类只能做一件事,要么读文件,要么写文件。解决方法,我们可以再创建一个FileStream
                //备注;这里先不管,文件流的释放的问题了。测试阶段,后面会优化。
    
                //这里为测试方便,就选择把读取的文件,读到D盘aaa.txt文件中。
                //写文件,模式选择Create
                FileStream fileWrite = new FileStream(@"D:aaa.txt", FileMode.Create);
    
                //然后就是写入文件中了
                
                fileWrite.Write(fileByte, 0, fileByte.Length);
    
                //测试代码,完毕之后,显示OK
                MessageBox.Show("OK");
    
    
            }
        }
    }

    注意;这个例子需要执行成功之后,需要将程序停止,才可以看到文件文件中读取到的数据,FileStream的缓存作用。。

    下面来优化一下代码:

    上面的代码,只能执行一次,因为文件流没有被释放:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace FileReadDemo
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void txtPath_Click(object sender, EventArgs e)
            {
                //文件打开对话框
                OpenFileDialog openDialog = new OpenFileDialog();
    
                //显示对话框的方法。返回值是DialogResult类型
                //openDialog.ShowDialog();
                if (openDialog.ShowDialog() == DialogResult.OK)
                {
    
                    txtPath.Text = openDialog.FileName;   //获取全路径
    
    
                }
    
            }
    
            private void btnRead_Click(object sender, EventArgs e)
            {
                //1.读取文件的话,我们需要使用文件的读写类,这里使用FileStream类,引用命令空间System.IO.
                //读文件,模式选择Open
                using (FileStream fileRead = new FileStream(txtPath.Text, FileMode.Open))
                {
    
    
    
                    //创建byte类型的数组(注意这个时候,有个疑问了,数组大小应该创建多大的呢?)
                    byte[] fileByte = new byte[fileRead.Length];
    
                    //2.将文件中所指定的数据读取到数组中
                    fileRead.Read(fileByte, 0, fileByte.Length);
    
                    //现在已经按照文件读写原理,把磁盘的数据转为二进制,存到数组了,现在需要写入到文件中
                    //但FileStream类只能做一件事,要么读文件,要么写文件。解决方法,我们可以再创建一个FileStream
                    //备注;这里先不管,文件流的释放的问题了。测试阶段,后面会优化。
    
                    //这里为测试方便,就选择把读取的文件,读到D盘aaa.txt文件中。
                    //写文件,模式选择Create
                    using (FileStream fileWrite = new FileStream(@"D:aaa.txt", FileMode.Create))
                    {
    
                        //然后就是写入文件中了
    
                        fileWrite.Write(fileByte, 0, fileByte.Length);
    
                        //测试代码,完毕之后,显示OK
                        MessageBox.Show("OK");
                    }
    
                }
    
    
            }
        }
    }
  • 相关阅读:
    Git SVN 版本控制 简介 总结 MD
    shape selector 背景 圆形 矩形 圆环 [MD]
    eclipse library jar包 使用总结 MD
    Visitor 访问者模式 [MD]
    BlazeMeter+Jmeter 搭建接口测试框架
    nGrinder 简易使用教程
    65个面试常见问题技巧回答(绝对实用)
    [面试技巧]16个经典面试问题回答思路
    质量模型测试电梯
    linux apache服务器优化建议整理(很实用)
  • 原文地址:https://www.cnblogs.com/caofangsheng/p/4986865.html
Copyright © 2011-2022 走看看