C# 学习笔记 19.文件操作

1.文件操作的核心类 .net framerwork提供的文件操作基本都在

system.io命名空间下。

C#学了之后感觉比c++用起来方便很多。c++如果融入更多好的工具包多好。

2.File类

FILE 的方法都是静态的效率高。相对Fileinfo

class Program
    {
        static void Main(string[] args)
        {
            FileStream fs = null;
            StreamWriter writer = null;
            string path = "D:\\test.txt";
            if(!File.Exists(path))
            {
                fs = File.Create(path);
                Console.WriteLine("新建一个文件:{0}", path);

            }
            else
            {
                fs = File.Open(path, FileMode.Open);
                Console.WriteLine("文件存在,直接打开!");
            }
            writer = new StreamWriter(fs);
            writer.WriteLine("测试文本");
            Console.WriteLine("向测试文件写入数据");
            writer.Flush();
            writer.Close();
            Console.WriteLine("关闭数据流!");
            Console.ReadKey();
        }
    }

3.Directory 和DirctoryInfo类

2个类包含了创建,移动,删除,枚举目录和子目录成员。

 

 

 class Program
    {
        static void Main(string[] args)
        {
            string dir_path = "D:\\DirectoryPath";

            string file_path = string.Format("{0}\\{1}",dir_path,"test.txt");
            if(!Directory.Exists(dir_path))
            {
                Directory.CreateDirectory(dir_path);
                Console.WriteLine("新建一个目录:{0}", dir_path);

            }
            else
            {
                Console.WriteLine("目录存在,直接打开!");
            }

            FileInfo file = new FileInfo(file_path);
            if(!file.Exists)
            {
                file.Create();
                Console.WriteLine("新建文件{0}!",file_path);

            }
            else
            {
                Console.WriteLine("文件 :{0} 存在!", file_path);

            }
            Console.ReadKey();
        }
    }

4.Stream 流

文件操作离不开流相关操作

流(stream)可以理解为内存中的字节序列。

stream是所有流的抽象基类,比如FileStrem类就表示 文件 这种存储实体。

3个基本操作

1.对流进行读取-把流中的数据读取到具体的数据结构中(如数组)

2.对流进行写入-把数据结构中的数据写入到流中。

3.对流进行查找-对流内当前位置进行查询和修改。

下面用到using(){}简单解释一下

using(){}作为语句,用于定义一个范围,在此范围的末尾将释放对象。

using 语句允许程序员指定使用资源的对象应当何时释放资源。using 语句中使用的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。

还会用到 using System.Text; 后面再讲

 class Program
    {
        static void Main(string[] args)
        {
            string file_path = "D:\\test.txt";
            using (FileStream file_stream = File.Open(file_path, FileMode.OpenOrCreate))
            {
                string msg = "hello world !";
                byte[] msgAsbyteArray = Encoding.Default.GetBytes(msg);
                file_stream.Write(msgAsbyteArray, 0, msgAsbyteArray.Length);
                file_stream.Seek(0, SeekOrigin.Begin);
                Console.WriteLine("写入文件的数据为:");
                byte[] byte_from_file = new byte[msgAsbyteArray.Length];
                file_stream.Read(byte_from_file, 0, msgAsbyteArray.Length);
                Console.WriteLine(Encoding.Default.GetString(byte_from_file));
                Console.ReadKey();
            }
        }
    }

 

 

 

streamReader 和 StreamWriter 使用

 class Program
    {
        static void Main(string[] args)
        {
            string file_path = "D:\\test.txt";
            using (FileStream file_stream = File.Open(file_path, FileMode.OpenOrCreate))
            {
                string msg = "hello world ...!";
                StreamWriter stream_write = new StreamWriter(file_stream);
                Console.WriteLine("开始写入文件{0}", msg);
                stream_write.Write(msg);
                StreamReader stream_reader = new StreamReader(file_stream);
                string read_file = stream_reader.ReadToEnd();
                Console.WriteLine("文件{0}数据\n", read_file);
                stream_write.Close();
                stream_reader.Close();
                Console.ReadKey();
            }
        }
    }

 

5.对文件进行异步操作

FileStream类有15个构造函数,只有一个可以进行异步操作

FIleStream(string path,Filemode mode,FIleAccess access,FIleShare share,in bufferSize,bool useAsync);

对文件的异步操作使用BeginRead 和 BeaginWite 方法

 

 class Program
    {
        static void Main(string[] args)
        {
            string file_path = "D:\\test.txt";
            FileStream file_stream = null;
            FileInfo file_info = new FileInfo(file_path);
            if(!file_info.Exists)
            {
                file_stream = File.Create(file_path);
                Console.WriteLine("新建文件夹:{0}", file_path);
                file_stream.Close();
            }
            else
            {
                Console.WriteLine("文件夹存在:{0}", file_path);
            }
            file_stream = new FileStream(file_path, FileMode.Open, FileAccess.Write, FileShare.None, 4096, true);
            Console.WriteLine("开启异步操作{0}", file_stream.IsAsync);
            string msg = "hello world async!";
            byte[] buffer = Encoding.UTF8.GetBytes(msg);
            //开始异步操作
            IAsyncResult asyncResult = file_stream.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(EndWriteCallBack), file_stream);
            Console.WriteLine("开始异步操作,请稍后...");
            Console.Read();
        }
        //异步操作完成后调用
        static void EndWriteCallBack(IAsyncResult asyncResult)
        {
            Console.WriteLine("异步写入开始...");
            FileStream stream = asyncResult.AsyncState as FileStream; // 转类型 变为FileStream
            if(stream != null)
            {
                stream.EndWrite(asyncResult);
                stream.Close();
            }
            Console.WriteLine("异步写入完毕!");
        }
    }

//没有按实际的顺序输出,后面再看看。应该会先打印"开始异步操作"才对.

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值