• c# 文件与流


    1、创建和删除目录

      在c#中涉及到输入、输出(i/o)相关操作的API都被放在System.IO命名空间下,或者子命令System.IO.IsolatedStoorage中。对目录进行操作可以使用Directory类和DirectoryInfo类。Directory类,提供了一些便捷的方法可以帮助开发人员轻松的对目录进行操作。DirectoryInfo类的功能和Directory类相似,公开了更多的成员以获得目录信息。

      使用两个按钮实现,文件目录的创建和删除

    //引入输入、输出命名空间。
    using System.IO;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {  
               //声明两个私有字段
                DirectoryInfo dirInfo = null;//操作目录的对象
                string dirName = string.Empty;//用于存储目录名称
                
            public Form1()
            {
                InitializeComponent();
              
            }
            //创建按钮Click
            private void button1_Click(object sender, EventArgs e)
            {
                //判断输入是否为空
                if(string .IsNullOrWhiteSpace(textBox1.Text))
                {
                    //打印提示语句
                    MessageBox.Show("IN err");
                    return;
                }
                dirName = textBox1.Text.Trim();//从当前System.String 对象移除所有空白字符和尾部空白字符 保存在目录名中
                dirInfo = new DirectoryInfo(dirName);//实例dirInfo
                //判断目录是否存在
                if(dirInfo.Exists)//如果目录存在,则为 true;否则为 false。
                {
                    dirInfo.Delete();//如果存在删除目录
                }
                //创建目录
                dirInfo.Create();
                MessageBox.Show("目录" + dirName + "创建成功");
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
            //删除按钮Click
            private void button2_Click(object sender, EventArgs e)
            {
                if(dirInfo!=null && !string.IsNullOrWhiteSpace(dirName))
                {
                    dirInfo.Delete();
                    dirInfo = null;
                }
            }
        }
    }

    注意:如果希望在指定的目录下创建目录,可以指定绝对路径。

    2、创建文件和删除文件

      与目录操作相似,对于文件操作,同样有两个类可以选择。File类和FileInfo类。

      

    //引入文件命名空间
    using System.IO;
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            string fileName = string.Empty;//用于存放新文件的名字
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
            //Create Click Button function
            private void Create_Click(object sender, EventArgs e)
            {
                //判断文件名是否为空
                if(string.IsNullOrWhiteSpace(Name.Text))
                {
                    MessageBox.Show("文件名为空");
                    return;
                }
                fileName = Name.Text;
                //如果文件已存在,删除
                if (File.Exists(fileName))//确定指定文件是否存在
                {
                    File.Delete(fileName);
                }
                var fs = File.Create(fileName);//创建文件
                //向文件写入3000字节
                Random rand = new Random();
                byte[] buf = new byte[3000];
                rand.NextBytes(buf);//使用随机数填充指定字节数组元素
                fs.Write(buf, 0, buf.Length);//将字节快写去文件流
                MessageBox.Show("创建"+fileName+"成功");
                fs.Dispose();//释放资源,Syst.IO.Stream使用的资源
            }
    
            private void Delete_Click(object sender, EventArgs e)
            {
                if(File.Exists(fileName))
                {
                    File.Delete(fileName);//删除文件
                }
            }
        }
    }

     3、流

      流是数据传递的一个载体,他是一个以Stream类为公共基类的对象,封装了一系列成员用于对流进行读写操作。流内有一个  位置指针 用于指示当前读写的位置。按照使用的方式不同,流也可以分为文件流、内存流和网络流。

      文件流:用于对文件进行操作的流对象。

      内存流:仅仅存在内存中,当应用程序退出或计算机电源关闭,内存流中的数据就会丢失,一般可以用来临时存储数据。

      网络流:用于网络数据的传输,例如在Socket可以使用网络流来发送和接收数据。

    流对象自身在封装是会公开相关以便开发人员对流进行操作。为了使流操作方便,System.IO命名空间提供了几个辅助类

      StreamReader 类和StreamWriter类:封装了对流中有关字符的操作。例如向流中写入一行字符,或者一次性读取所有字符

      BinaryReader类和BinaryWriter类:专用于读写二进制数据,例如读取一个整形数int

    4、读写文件

      对文件进行读写需要用到文件流FillStrea,可以通过以下几种方式获取文件里流对象

    读取:File类的Open或者OpenRead方法。   FileInfo类的Open或OpenRead方法

    写入:File类的Create方法  File类的Open或者Openwrite方法        FileInfo类的Create方法  FileInfo类的Open或OpenWriter方法

      如果仅仅希望简单的进行读写操作,可以直接使用File类的 WriteAllBytes、WriteAllLines、WriteAllText、ReadAllText、ReadLines等方法

    using System.IO;
    namespace ConsoleApp1
    {
        class Program
        {
            const string FILE_NAME = "newFIle.txt";//定义文件名
            static void Main(string[] args)
            {
                /*****写入数据 *****/
                //创建FileStream流实例
                //打开文件,如果文件不存在就创建文件。以写入方式打开文件,
                using (FileStream fs = new FileStream(FILE_NAME, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read))
                {
                    BinaryWriter bw = new BinaryWriter(fs);//初始化 System.IO.BinareWrite实例
                    bw.Write(false);//写入一个bool值
                    bw.Write((int)9999);//写入一个int值
                    bw.Write("hello hjx");//写入字符串
                    bw.Close();//关闭对象
                }
                Console.WriteLine("file write is ok");
                /*******读出数据******/
                bool b;
                int n;
                string s;
                using (FileStream fsin = File.OpenRead(FILE_NAME))//打开文件
                {
                    BinaryReader br = new BinaryReader(fsin);//实例fsin
                    //读出的顺序必须与写入的顺序相同
                    b = br.ReadBoolean();// 从当前流中读取 Boolean 值,并使该流的当前位置提升 1 个字节。
                    n = br.ReadInt32();//从当前流中读取 4 字节有符号整数,并使流的当前位置提升 4 个字节
                    s = br.ReadString();//读出字符串从当前流中读取一个字符串。 字符串有长度前缀,一次 7 位地被编码为整数。
                    br.Close();//关闭对象
                }
                //显示结果
                Console.WriteLine("{0}", b);
                Console.WriteLine("{0}", n);
                Console.WriteLine("{0}", s);
                Console.ReadLine();
            }
        }
    }

    直接使用FileStream 类读写文件

    using System.IO;
    namespace ConsoleApp2
    {
        class Program
        {
            static void Main(string[] args)
            {
                Random rand = new Random();//实例random
                byte[] buf = new byte[10];
                //产生10个随机字节
                rand.NextBytes(buf);//使用随机数填充指定字节数组元素
                Console.WriteLine("随机序列{0}",BitConverter.ToString(buf));
    
                //将随机产生的字节写入文件
                try
                {
                    FileStream fs = File.Create("data.dt");
                    //将字节数组中所有的字节都写入文件
                    fs.Write(buf, 0, buf.Length);
                    fs.Close();//关闭文件流
                    Console.WriteLine("write data ok");                   
                }
                catch(IOException ex)
                {
                    Console.WriteLine(ex.Message);//输出错误信息
                }
                //从文件中读出数据
                Array.Clear(buf, 0, buf.Length);//清除buf中的内容
                try
                {
                    FileStream fs = File.OpenRead("data.dt");
                    //从文件流中读出所有字节
                    fs.Read(buf, 0, buf.Length);
                    fs.Close();//关闭文件流
                }
                catch(IOException ex)
                {
                    Console.WriteLine(ex.Message);
                }
                //输出结果
                Console.WriteLine("read data:{0}", BitConverter.ToString(buf));
                Console.Read();
            }
    
        }
    }

     5、内存流

      内存流按照类型可以分为托管内存流 ,以MemoryStream类为代表,和非托管内存流以UnmannedMemoryStream代表,在实际的开发中,使用最多的是托管内存流,而非托管内存流一般可以用于操作内存映射文件。

    using System.IO;
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                MemoryStream ms = new MemoryStream();//创建内存流
                //创建文件流用于保存png图像
                FileStream fs = new FileStream("1.png", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read);
                //生成位图
                using (Bitmap bmp = new Bitmap(150, 150))
                {
                    Graphics g = Graphics.FromImage(bmp);
                    Pen mypen = new Pen(Color.Blue, 5f);
                    Rectangle rect1 = new Rectangle(20, 50, 60, 50);// 用指定的位置和大小初始化 System.Drawing.Rectangle 类的新实例。
                    Rectangle rect2 = new Rectangle(80, 0, 60, 120);
                    //绘制矩形
                    g.DrawRectangles(mypen, new Rectangle[] { rect1, rect2 }); // 绘制一系列由 System.Drawing.Rectangle 结构指定的矩形。
                    mypen.Dispose();//释放钢笔对象
                    g.FillEllipse(Brushes.Red, new Rectangle(35, 40, 90, 90)); // 填充 System.Drawing.Rectangle 结构指定的边框所定义的椭圆的内部。
                    g.Dispose();//释放画布对象
                    bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);//将图像保存到内存流中
                    bmp.Save(fs, System.Drawing.Imaging.ImageFormat.Png);//将图像保存到文件流中
                }
                //从内存流中加载图像
                this.pictureBox1.Image = Image.FromStream(ms);
                ms.Dispose();//释放内存流
            }
        }
    }

     6、内存映射文件

      MemoryMappedFile类位于System.IO.MemoryMappedFile命名空间,公开了一系列的Api,用于创建和读写内存映射文件。内存映射文件存在于内存中,形式上类似磁盘上存储的文件,只是内存映射文件存放在内存中。当MemoryMappedFild类的实例被释放或者操作内存映射文件的最后一个进程退出后,文件就会被销毁。

      

  • 相关阅读:
    BZOJ-4008: [HNOI2015]亚瑟王 (概率期望DP)
    BZOJ-4832: [Lydsy2017年4月月赛]抵制克苏恩 (概率期望DP)
    BZOJ-1415: [Noi2005]聪聪和可可 (期望DP)
    BZOJ2425 [HAOI2010]计数
    BZOJ2424 [HAOI2010]订货
    BZOJ2423 [HAOI2010]最长公共子序列
    BZOJ2299 [HAOI2011]向量
    BZOJ2298 [HAOI2011]problem a
    BZOJ1040 [ZJOI2008]骑士
    BZOJ一天提交(AC) 51纪念
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/8097605.html
Copyright © 2020-2023  润新知