• C#文件操作


    FileInfo、DirectoryInfo

    • 查看问价属性、创建文件、移动文件、重命名文件
    • 判断路径是否存在,创建目录

    FIle

    • 读写文件

    使用流来读取文件

    • FileStream
    • StreamReader(读取流-读取数据)
    • StreamWriter(写入流-向别人传输)

    文件系统

    • 下面的类用于浏览文件系统和执行操作,比如移动,复制和删除文件。
    方法说明
    System.MarshalByRefObject这个是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据。
    FileSystemlnfc这是表示任何文件系统对象的基类
    Filelnfo和File这些类表示文件系统上的文件
    Directorylnfo和Directory表示文件系统上的文件夹
    Path包含用于处理路径名的一些静态方法
    Drivelnfa它的属性和方法提供了指定驱动器的信息

    表示文件和文件夹的NET类

    • 我们有两个用于表示文件夹的类和两个用于表示文件的类
      • Directory(文件夹)和File(文件)类只包含静态方法,不能被实例化。如果只对文件夹或文件执行一个操作,使用这些类就很有效,省去了去实例化.NET类的系统开销。
      • Directorylnfo类和Filelnfo类实现与Directory和File相同的公共方法,他们拥有一些公共属性和构造函数,这些类的成员都不是静态的。需要实例化这些类,之后把每个实例与特定的文件夹或者文件关联起来。如果使用同一个对象执行多个操作,使用这些类比较合适,这是因为在构造的时候他们将读取合适文件系统对象的身份验证和其他信息,无论每个对象调用了多少方法,都不需要再次读取这些信息。

    Filelnfo和Directorylnfo类

    • 对于Filelnfo和Directorylnfo类中的很多方法也可以使用File和Directory中的很多方法实现。
    1. 完成一个文件的拷贝
    Filelnfo myFile=new Filelnfo(@”c:pxx\xx\xxx\xxx.txt”)
    myFile.CopyTo(@"d:\xx\xx.txt”)://拷贝文件
    对应的File处理方式
    File.Copy(@”c:xxx\xx\xx\xx.txt",@d:xx\xx\xx.txt”);
    
    • 1
    • 2
    • 3
    • 4
    1. 判断一个文件夹是否存在
    Directorylnfo myFolder=new Directorylnfo(@”c:program files”);
    
    • 1
    1. myFolder.Exists
    • 对于Filelnfo,或者Directorylnfo进行构造的时候,如果传递了一个不存在的文件或者文件夹路径,这个时候不会出现异常,只有当你使用这个文件或者文件夹的时候才会出现问题。
    • Filelnfo和Directorylnfo的对象都可以通过Exists属性判断这个文件或者文件夹是否存在。
    • Filelnfo和Directorylnfo的属性列表

    Filelnfo和Directorylnfo的属性列表

    属性说明
    CreationTime创建文件或文件夹的时间
    DirectoryName(用于Filelnfo)包含文件夹的完整路径
    Parent(用于Directorylnfo)指定子目录的父目录
    Exists文件或文件夹是否存在
    Extension文件的扩展名,对于文件夹,它返回空白
    FulIName文件或文件夹的完整路径名
    LastAccessTime最后一次访问文件或文件夹的时间
    LastWriteTime最后一个修改文件或文件夹的时间
    Name文件或文件夹的名称
    Root(仅用于Directorylnfo)路径的根部分
    Length(仅用于Filelnfo)返回文件的大小(以字节为单位)

    Filelnfo和Directorylnfo的方法列表

    方法说明
    Create()创建给定名称的文件夹或者空文件,对于Filelnfo,该方法会返回一个流对象,以便于写入文件。
    Delete()删除文件或文件夹。对于文件夹有一个可以递归的Delete选项
    MoveTo()移动或重命名文件或文件夹
    CopyTo()(只用于Filelnfo)复制文件,文件夹没有复制方法,如果想要复制完整的目录树,需要单独复制每个文件和文件夹
    GetDirectories()(只适用于Directorylnfo)返回Directorylnfo对象数组,该数组表示文件夹中包含的所有文件夹
    GetFiles()(只适用于Directorylnfo)返回Filelnfo对象数组,该数组表示文件夹中所有的文件
    GetFileSystemlnfos()(只适用于Directorylnfo)返回Filelnfo和Directorylnfo对象它把文件夹中包含的所有对象表示为一个FileSystemlnfo引用数组

    小案例一

    using System;
    using System.IO;
    
    namespace test11
    {
        internal class Program
        {
            //文件操作
            public static void Main(string[] args)
            {
                    //FileInfo DirectoryInfo
                    //.\都是exe程序所在路径(通常是bin\Debug\下)
                    //..\..\程序根目录的上级目录的上级目录即,test11
                    try
                {
                    FileInfo myFile = new FileInfo(@"..\..\test1.txt");
                    myFile.Create();
                    Console.WriteLine("File is created Successfully");
                }
                catch (IOException e)
                {
                    Console.WriteLine(e);
                }    
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    小案例二

    • 创建时间,最后一次访问时间和最后一次写入时间都是可写入的。
    Filelnfotest=newFilelnfo(@”c:myfile.txt”);
    Console.WriteLine(test.Exists);
    Console.WriteLine(test.CreationTime);
    test.CreationTime=new.DataTime(2010117200);
    Console.WriteLine(test.CreationTime);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Path类

    • 我们不能去实例化Path类,Path类提供了一些静态方法,可以更容易的对路径名执行操作。
    Console.WriteLine(Path.Combine(@"c:\my Cdocuments","Readme.txt"));
    
    • 1

    在不同的操作系统上,路径的表示是不一样的windows上是,在Unix就是/,我们可以使用Path.Combine连接两个路径,不用关心在哪个系统上.

    Path类的静态字段

    字段说明
    AltDirectorySeparatorChar提供分割目录的字符,在windows上使用\在Unix上用/
    DirectorySpeparatorChar提供分割目录的字符,在windows上使用/在Unix上用\
    PathSeparator提供一种与平台无关的方式,来指定划分环境变量的路径字符串,默认为分号
    VolumeSepartorChar提供一种与平台无关的方式,未指定容量分割符,默认为冒基一世

    读写文件

    • 在.NET2.0扩展了File类,通过File可以读写文件。
    File类说明
    File.ReadAlIText(FilePath)根据文件路径读取文件中所有的文本
    File.ReadAlIText(FilePath,Encoding)Encoding可以指定一个编码格式Encoding.ASCIl:
    File.ReadAllBytes()方法可以打开二进制文件把内容读入一个字节数组
    File.ReadAlILines()以行的形式读取文件,一行一个字符串,返回一个字符串的数组

    在这里插入图片描述

    • 流是一种数据的处理方式
    • 为什么使用流处理数据?
      • 数据小,可以直接一次性搬运,数据大,可以把数据当做水,接一个水管,一点一点搬运。

    流媒体

    • 流是一个用于传输数据的对象,数据可以向两个方向传输:
      • 如果数据从外部源传输到程序中,这就是读取流
      • 如果数据从程序传输到外部源中,这就是写入流
    • 外部源可能是一个文件、网络上的数据、内存区域上、读写到命名管道上
    • 读写内存使用System.IO.MemorySystem
    • 处理网络数据使用Svstem.Net.Sockets.NetworkStream

    构造函数的参数

    构造函数取值
    FileMode(打开模式)Append,Create,CreateNew,Open,OpenOrCreate和Truncate
    FileAccess(读取还是写入)Read,ReadWrite和Write
    FileShare(文件共享设置)Delete,Inheritable,None,Read,Readwrite和Write
    • 注意
      • 如果文件不存在AppendOpen和Truncate会抛出异常;如果文件存在CreateNew会抛出异常
      • Create和OpenOrCreatecreate会删除现有的文件,新建一个空的文件,OpenOrcreate会判断当前是否有文件,没有的话才会创建。

    在这里插入图片描述
    在这里插入图片描述

    FileStream文件流的关闭

    • 当我们使用完了一个流之后,一定要调用fs.Close();方法去关闭流,关闭流会释放与它相关联的资源,允许其他应用程序为同一个文件设置流。这个操作也会刷新缓冲区。在这里插入图片描述

    文件流中读取内容和写入内容

    从文件流读取内容

    1. intnextByte=fs.ReadByte();读取一个字节(0-255)的数据,返回结果,如果达到流的末尾,就返回-1。
    2. intnBytesRead=fs.Read(ByteArray,0,nBytes);//读取多个字节,第一个是存放的数组,第二个参数是开始存放的索引,第三个参数是要读取多少个字节。返回的结果是读取的自己的实际个数,如果达到流的末尾返回-1。
    
    • 1
    • 2

    在这里插入图片描述

    向文件流写入内容

    1. byteNextByte=100;fs.WriteByte(NextByte):把一个字节写入文件流中
    2. fs.Write(ByteArray,0,nBytes);把一个自己数组写入文件流中参数同上
    • 读取流-写入流
    • 输入流 - 输出流
    • 读写文本文件
      • 我们对文本文件的读写一般使用StreamReader和StreamWriter,因为不同的文本有不同的编码格式,这个StreamReader会帮我们自动处理,所以我们不需要关心文本文件的编码是什么
    1. 创建文本的读取流(会检查字节码标记确定编码格式
    StreamReader sr =new StreamReader(@"c:xx\ReadMe.txt");
    
    • 1
    1. 指定编码格式
    StreamReader str =new StreamReader(@"c:xx/xx.txt",Encoding.UTF8);
    //(可取的编码格式ASCIIUnicodeUTF7UTF8UTF32)
    
    • 1
    • 2
    1. 在文件流的基础上创建文本读取流
    FileStreamfs=new FileStream(@"c:xx\xx.txt",FileMode.Open,FileAccess.Read,FileShare.None);
    StreamReader sr =new StreamReader(fs);
    
    • 1
    • 2

    4.通过文件信息创建文本读取流一第二种方式

    Filelnfo myFile=newFilelnfo(@"c:xx/xx.txt");
    StreamReader sr=myFile.OpenText();
    
    • 1
    • 2
    1. 流的关闭 sr.Close();

    文本写入流StreamWriter-创建

    在这里插入图片描述
    在这里插入图片描述

    文本写入流StreamWriter-写入

    1. 写入一行字符
    string nextLine=“×XXXXXX";sw.Write(nextLine);
    
    • 1
    1. 写入一个字符
    char nextChar ='a';
    sw.Write(nextChar);
    
    • 1
    • 2
    1. 写入字符数组
    char[] charArray=..;
    sw.Write(charArray);
    
    • 1
    • 2
    1. 写入字符数组的一部分
    sw.Write(charArray,Startlndex,Length);
    
    • 1
    • charArray: 要写入的数组
    • Startlndex:开始索引
    • 写入长度
      在这里插入图片描述
      在这里插入图片描述

    复制文件案例对比

    细管道

    using System;
    using System.IO;
    
    namespace test12
    {
        internal class Program
        {
            public static void Main(string[] args)
            {
                var start = DateTime.Now;
                FileStream readFileStream = new FileStream(@"..\..\girl.jpg",FileMode.Open,FileAccess.Read);
                FileStream writeFileStream = new FileStream(@"..\..\CopyGirl.jpg", FileMode.Create, FileAccess.Write);
                int nextByte = -1;
                while ((nextByte = readFileStream.ReadByte()) != -1)
                {
                    writeFileStream.WriteByte((byte)nextByte);
                }
                writeFileStream.Close();
                readFileStream.Close();
                var end= DateTime.Now;
                var timeSpan = end.Subtract(start);
               Console.WriteLine(timeSpan.TotalMilliseconds);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    粗管道

    using System;
    using System.IO;
    
    namespace test13
    {
        internal class Program
        {
            public static void Main(string[] args)
            {
                var start = DateTime.Now;
                FileStream readFileStream = new FileStream(@"..\..\girl.jpg",FileMode.Open,FileAccess.Read);
                FileStream writeFileStream = new FileStream(@"..\..\CopyGirl.jpg", FileMode.Create, FileAccess.Write);
                // int nextByte = -1;
                // while ((nextByte = readFileStream.ReadByte()) != -1)
                // {
                //     writeFileStream.WriteByte((byte)nextByte);
                // }
                byte[] buffer = new byte[1024];
                int count = -1;
                while ((count = readFileStream.Read(buffer, 0, 1024)) != 0)
                {
                    writeFileStream.Write(buffer,0,count);
                }
                writeFileStream.Close();
                readFileStream.Close();
                var end= DateTime.Now;
                var timeSpan = end.Subtract(start);
                Console.WriteLine(timeSpan.TotalMilliseconds);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

  • 相关阅读:
    腾讯云CVM服务器5年可选2核4G和4核8G配置
    前k个高频元素
    Ai数字人直播系统SaaS源码大开源,源码独立部署助力中小企业发展!
    激活数据价值,探究DataOps下的数据架构及其实践丨DTVision开发治理篇
    Java基础进阶网络编程-TCP和UDP协议
    已知平面内三点,求其平面的法向量
    ANSYS_Q3D仿真激光发射的寄生电感
    redis实战篇03
    Semantic Kernel 知多少 | 十行代码开发一个AI应用
    不适用于云的应用程序有哪些?
  • 原文地址:https://blog.csdn.net/yang2330648064/article/details/127604147