C# 文件读取

前言
  • 任何类的存在都是为了某个功能,而实现这些功能,有一套广而有效的抽象逻辑准则
  • 只要这个准则掌握了,那些具体的实现细节和api的调用就很容易理解了
文件
  • 对于文件,我们有 读取, 创建, 剪切,复制,写入,追加写入等操作
  • 在System.IO命名空间下面
  • 在创建一个与文本文件相关的实例时,都需以其相对路径或绝对路径作为参数
  • 在创建文件时,需要注意覆盖问题,即在文件夹中存在与其同名的文件,则覆盖,或者报出错误
  • 注意要标注上 后缀名
文件系统
  • FileSystemInfo 表示任何文件系统对象的基类
  • FileInfo 与File 表示文件系统上的文件
  • DirectoryInfo 和Directory 表示文件系统的文件夹
  • DriveInfo 属性和方法提供了驱动器的信息
FileInfo 与DirectoryInfo读取属性
  • 通过FileInfo和DirectoryInfo类来读取文件和文件夹属性
  • 查看文件属性,创建文件,移动文件,重命名文件
  • 我们可以通过剪切时命名来达到重命名的目的
 FileInfo file = new FileInfo("Hello.txt");
 // 一些常用属性
            Console.WriteLine(file.Exists);   //是否存在
            Console.WriteLine(file.FullName); //文件全名
            Console.WriteLine(file.Extension); //文件扩展名
            Console.WriteLine(file.IsReadOnly); //是否只读
            Console.WriteLine(file.Length); //文件的长度
            Console.WriteLine(file.Name); //文件的名字
            Console.WriteLine(file.DirectoryName); //文件夹名字

            file.Delete(); //删除
            file.CopyTo("doit.txt", true); /复制 是否覆写
            file.MoveTo("cut.txt"); //剪切
  • 【常用方法】判断文件是否存在,不存在则创建文件
       //创建一个文件夹
            DirectoryInfo dirinfo = new DirectoryInfo("seqing");
            if (dirinfo.Exists == false)
            {
                dirinfo.Create();
            }
	//创建一个文本文件
	            FileInfo fileinfo = new FileInfo("good.txt");
            if (fileinfo.Exists == false)
            {
                fileinfo.Create();
            }

通过File读写文件
  • File是一个静态类,无法构造对象,我们可以通过它来对文件进行各种操作
  • 如果只对文件执行一个操作时,这些类很有效,省去了实例化的开销
  • 它和FileInfo有相同的公共方法,公共属性和构造函数,但都不是静态的,需要把每个实例与特定的文件夹或文件关联
  • 如果同一个对象需要执行多个操作,使用这些类比较合适
  • 并且两者都可以协助开启一个流对象

            string[] sm = File.ReadAllLines("Hello.txt");
            foreach (var item in sm)
            {
                Console.WriteLine(item);
            }
            string con = File.ReadAllText("Hello.txt");
            byte[] data = File.ReadAllBytes("Hello.txt");
 
            //他会进行覆盖
            File.WriteAllText("moon.txt", "我爱你");
            File.WriteAllLines("EnglishWord.txt", new string[] { "good", "bad", "happy", "ward" });
            byte[] datas = File.ReadAllBytes("le_petit_prince.jpg"); //写入字节数组
            File.WriteAllBytes("copy.jpg", datas);
  • 指定编码格式
File.ReadAllText(FilePath, Encoding);
 File.ReadAllText("love.txt", Encoding.UTF8);

使用流来读写文件
  • 在UdpClient和TCPclient与TCPServer中,我们通过网络流读取数据,操作相似

  • 流是一个用于传输数据的对象,数据可以向两个方向传输:
    如果数据从外部源传输到程序中,这就是读取流
    如果数据从程序传输到外部源中,这就是写入流

  • 外部源可能是
    一个文件
    网络上的数据
    内存区域上
    读写到命名管道上

  • 读写内存使用System.IO.MemorySystem

  • 处理网络数据使用System.Net.Sockets.NetworkStream

通过FileStream来读取数据
  • 这个类读取和写入的是字节数据 适合用于图片类型
  • 对于文本数据,用StreamWriter和StreamReader不用在意格式问题
    • 创建读取文件的流对象
    • 创建写入文件的流对象
    • 创建一个容器字节数组
    • 循环将读取文件的字节传输到写入文件中,直到读取到文件末尾
    • 关闭输入流对象
    • 关闭输出流对象
  • 当我们使用完了一个流之后,一定要调用fs.Close();方法去关闭流,关闭流会释放与它相关联的资源,允许其他应用程序为同一个文件设置流。这个操作也会刷新缓冲区。
 FileStream readStream = new FileStream("le_petit_prince.jpg", FileMode.Open);
 FileStream writeStream = new FileStream("副本图片.jpg", FileMode.Create);
 byte[] dataDock = new byte[1024];
     while (true)
        {
          int lengths = readStream.Read(dataDock, 0, dataDock.Length);
           if (lengths == 0)
            {
                 break; //已经到达文件末尾
             }
          writeStream.Write(dataDock, 0, lengths); //将数据写入到新文件中
            }
            //关闭流
            writeStream.Close();
            readStream.Close();
通过StreamWriter StreamReader读取
  • 我们对文本文件的读写一般使用StreamReader和StreamWriter,因为不同的文本有不同的编码格式,这个StreamReader会帮我们自动处理,所以我们不需要关心文本文件的编码是什么
  • 两种方式
// 创建文本的读取流(会检查字节码标记确定编码格式)
	StreamReader sr = new StreamReader(@"c:\xx\ReadMe.txt");
//指定编码格式
	StreamReader str = new StreamReader(@"c:\xx\xx.txt",Encoding.UTF8);
	(可取的编码格式 ASCII Unicode UTF7 UTF8 UTF32)
	//通过File来创建一个流
   FileInfo myFile = new FileInfo(@"c:\xx\xx.txt");
	StreamReader sr = myFile.OpenText();
//通过文件流来创建一个文本读取流
FileStream fs = new FileStream("good.txt", FileMode.Create);
StreamReader reader = new StreamReader(fs);
  • 循环从文本文档中接收数据
    • 读取可以采用
    • ReadLine() 读取一行 读到末尾返回null
    • Read() 读取一个字符。返回该字符的ASII值,需要强制转换 读到末尾返回 -1
    • ReadToEnd() 直接读取到末尾
StreamReader reader = new StreamReader("Hello.txt");
            while (true)
            {
                string str1 = reader.ReadLine();//读取一行字符串
                if (str1 == null)
                {
                    break;
                }
                Console.WriteLine(str1);
            }


            string str = reader.ReadToEnd(); //读取文本中的所有字符
            Console.Write(str);

            while (true)
            {
                int res = reader.Read(); //读取一个字符
                if (res == -1)
                {
                    break;
                }
                else
                {
                    Console.Write((char)res); //强制转换成一个字符
                }
            }
  • 循环从控制台接收用户输入存取到文本文档中
 StreamWriter writer = new StreamWriter("liubi.txt");
            while (true)
            {
                string luas = Console.ReadLine();
                if (luas == "q")
                {
                    break;
                }
                writer.WriteLine(luas);
            }
            writer.Close(); //如果不关闭,则无法将数据写入到文本当中
            Console.ReadKey();
Path类
  • path类不能被实例化,它提供了静态方法来对路径进行操作
Console.WriteLine(Path.Combine(@"c:\my documents","Readme.txt"));
  • 它会根据系统来决定两个路径之间的连接符
  • AltDirectorySeparatorChar 提供分割目录的字符,在windows上使用 \ 在Unix上用 /
  • DirectorySpeparatorChar 提供分割目录的字符,在windows上使用 / 在Unix上用 \
  • PathSeparator 提供一种与平台无关的方式,来指定划分环境变量的路径字符串,默认为分号
  • VolumeSepartorChar 提供一种与平台无关的方式,来指定容量分割符,默认为冒号
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值