二十、文件系统相关技术

1、命名空间及基础概念

  • 文件是指存储在外部介质上的数据的集合,事宜实现某种功能、或某个软件的部分功能为目的而定义的一个单位。是在应用程序的实例值键存储数据的一种变脸方式,也可以用于在应用程序之间传递数据。文件可以存储用户和应用程序配置,以便在下次运行应用程序时检索他们
  • 序列化设备:序列化设备可以以线性方式存储数据,并可以按同样的方式访问:一次访问一个字节。此设备可以使磁盘文件、网络通道、内存位置或其他支持以线性方式读写的对象。
  • 流(Stream)是序列化设备(Serial device)的抽象标识。在.NET Framework中进行所有的输入和输出工作都要用倒流
    • 输出流:当向某外部目标写入数据时,就要用到输出流
    • 输入流:用于将数据读入程序可以访问的内存或变量中
  • 把设备编程抽象的,就可以隐藏流的底层目标和源。这种抽象的级别支持代码重用,允许编写更通用的程式,因为不必担心数据传输方式的特性。
  • System.IO命名空间包含用于在文件中读写数据的类,只有在C#应用程序中引用此命名空间才能访问这些类,而不必完全限定类型名。System.IO命名空间中包含了不少类,本章主要介绍用于文件输入和输出的类。
    在这里插入图片描述

2、文件操作值判断是否存在

  • File类和FileInfo类作用:主要提供有关文件的各种操作,如用于创建、复制、删除、移动和打开文件等操作,用于协助创建FileStrean对象。
  • 注意:
    • 在使用时需要应用System.IO命名空间
    • File类是静态方法,FileInfo类是动态方法,使用时必须通过new关键字创建实例。
  • 判断文件是否存在:File类的Exists方法来实现。
  • 使用格式为:File.Exists(文件路径)
using System;
using System.IO;   //应用命名空间

namespace _2_判断文件是否存在
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Admin\Desktop\548.rar";  //判断的文件
            if (File.Exists(path)) Console.WriteLine("指定路径下存在\"{0}\"",path);
            else Console.WriteLine("指定路径下不存在\"{0}\"", path);
            Console.ReadKey();
        }
    }
}

3、文件操作之创建

  • 创建文件:通过File类的Create方法实现
  • 格式为:
  • 注意:需要使用FileStream类的Close方法将所创建的文件关闭。由于File.Create方法默认向所有用户授予对新文件的完全读/写访问权限,所以文件是用读和写访问权限打开的。必须关闭后才能由其他应用程序打开。
using System;
using System.IO;

namespace _3_文件操作之创建
{
    class Program
    {
        static void Main(string[] args)
        {
            //文件创建过程中,如果文件已存在且是只读的,则会创建失败
            string path = @"C:\Users\Admin\Desktop\";   //注意最后的“\”必须保留,否则文件将创建为C:\Users\Admin\DesktopC#学习笔记.txt

            try
            {
                //File.Create(path + "C#学习笔记.txt");  //这样创建的文件无法将其关闭,所以采用下面方式(将创建文件赋值给一个文件流对象)
                FileStream newtext = File.Create(path + "C#学习笔记.txt");
                newtext.Close();  //关闭文件流,以便后续操作。使用完文件后及时关闭文件流。
                if (File.Exists(path + "C#学习笔记.txt")) Console.WriteLine("文件创建成功");
                else Console.WriteLine("文件创建失败");
            }
            catch (Exception ex)
            {

                Console.WriteLine("文件创建失败!原因是:" + ex.ToString());
            }

            //创建前判断
            if (!File.Exists(path+"C#学习笔记2.py"))
            {
                FileStream newtext2 = File.Create(path + "C#学习笔记2.py");
                newtext2.Close();
                Console.WriteLine("文件创建成功");
            }
            else Console.WriteLine("文件创已存在");
            Console.ReadLine();
        }
    }
}

4、文件操作之打开

  • 打开文件可通过File类的Open方法来实现
  • 格式为:Open(String path, FileMode mode);
  • FileMode:
    • Append:打开现有文件并定位值文件结尾,或创建新文件
    • Create:创建文件,如果存在,它将被改写
    • CreateNew:创建新文件,如果存在,将引发异常
    • Open:打开现有文件
    • OpenOrCreat :如文件存在,打开;如不存在创建新文件
    • TrunCate:打开现有文件,文件一旦被打开,将被截断为0字节大小
  • Filesstream类的Write方法是向指定文件中写入数据,该类有三个参数Write(byte[] array, int offset, int count);
  • byte[] array: 要写入的数据,是以字节方式写入的;
  • int offset: 第一个参数的偏量,对上面实例,如是0就是从1开始写入,如实2就是从L开始写入??。
  • int count:第三个参数就是要写入数据流的长度。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace _4_文件操作值打开
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Admin\Desktop\C#练习\C#学习笔记.txt";
            try
            {
                //FileStream texFile = File.Open(path, FileMode.Append); //文件操作,在末尾追加内容
                //FileStream texFile = File.Open(path, FileMode.Create); //文件操作, 如果存在改写全部内容
                //FileStream texFile = File.Open(path, FileMode.CreateNew); //文件操作, 如果存在抛出异常
                //FileStream texFile = File.Open(path, FileMode.Open); //文件操作, 文件不存在则抛出异常
                //FileStream texFile = File.Open(path, FileMode.OpenOrCreate); //文件操作, 如果文件存在打开,文件不存在创建
                FileStream texFile = File.Open(path, FileMode.Truncate); //文件操作, 将文件内容全部清除

                byte[] byteWrite = { (byte)'C', (byte)'#', (byte)'d', (byte)'a', (byte)'r', (byte)'l', (byte)'y' };
                texFile.Write(byteWrite, 0, byteWrite.Length);
                texFile.Close();
                Console.WriteLine("打开成功!");
            }
            catch (Exception ex)
            {

                Console.WriteLine("打开失败"+ex.ToString());
            }
            Console.ReadKey();

        }
    }
}

5、文件操作之复制

  • 复制文件可通过File类的copy方法来实现
  • Copy(string sourceFileName,String DestFileName,bool overwrite) 第一个参数是源文件,第二个参数是目标路径,第三个参数是否覆盖。
    • 文件复制时可能出现的情况
    • 源文件中有文件,目标文件夹中无文件
    • 源文件夹中无文件
using System;
using System.IO;

namespace _5_文件复制
{
    class Program
    {
        static void Main(string[] args)
        {
            string pathSource = @"C:\Users\Admin\Desktop\C#练习\source\c#learnNot.txt";
            string pathDestination = @"C:\Users\Admin\Desktop\C#练习\destination\copyC#learnNot.txt";
            if (File.Exists(pathSource))
            {
                try
                {
                    if(!File.Exists(pathDestination))
                    {
                        File.Copy(pathSource, pathDestination, false);
                        Console.WriteLine("文件复制成功");
                    }
                    else
                    {
                        Console.WriteLine("是否进行覆盖操作:\n1.覆盖\n2.取消复制\n输入选项对应的数字");
                        string mystr = Console.ReadLine();
                        if(mystr=="1")
                        {
                            File.Copy(pathSource, pathDestination, true);
                            Console.WriteLine("复制成功,并覆盖了同名文件");
                        }
                        else if(mystr=="2")
                        {
                            Console.WriteLine("您取消了复制,");
                        }
                        else
                        {
                            Console.WriteLine("您操作错误,撤销了复制操作,复制不成功");
                        }
                    }

                }
                catch (Exception ex)
                {

                    Console.WriteLine("复制失败,原因是:" + ex.ToString());
                }
            }
            else
            {
                Console.WriteLine("源文件没有找到,请确认后在进行复制");
            }
            Console.ReadKey();

        }
    }
}

6、文件移动

移动文件可通过File类的Move方法来实现:Move(String sourceFileName,string destFileName)

  • 源文件存在,目标文件不存在
  • 源文件存在,目标文件存在
  • 源文件不存在
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace _6_文件移动
{
    class Program
    {
        static void Main(string[] args)
        {
            string pathSource = @"C:\Users\Admin\Desktop\C#练习\source\2.txt";
            string pathDestination = @"C:\Users\Admin\Desktop\C#练习\destination\2.txt";
            if (File.Exists(pathSource))
            {
                try
                {
                    if (!File.Exists(pathDestination))
                    {
                        File.Move(pathSource, pathDestination);
                        Console.WriteLine("文件移动成功");
                    }
                    else
                    {
                        Console.WriteLine("目标文件夹中已存在同名文件,是否覆盖?\n1.覆盖\n2.取消移动\n3.不覆盖。\n请选择您相应的操作数字");
                        string operation = Console.ReadLine();
                        if (operation == "1")
                        {
                            File.Delete(pathDestination);
                            File.Move(pathSource, pathDestination);
                            Console.WriteLine("文件移动成功,并覆盖了目标中的同名文件");
                        }
                        else if (operation == "2")
                        {
                            Console.WriteLine("您取消了移动操作");
                        }
                        else if(operation=="3")
                        {
                            string [] strtemp = pathDestination.Split('.');
                            string pathtemp = strtemp[0] + 1 + '.' + strtemp[1];
                            File.Move(pathSource, pathtemp);
                        }
                        else
                        {
                            Console.WriteLine("您的操作错误,系统自动取消了移动操作");
                        }
                    }

                }
                catch (Exception ex)
                {

                    Console.WriteLine("移动失败,原因是:" + ex.ToString());
                }
            }
            else
            {
                Console.WriteLine("移动文件不存在,请确定文件名称及路径的正确是哪个");
            }
            Console.ReadKey();
        }
    }
}

7、文件删除操作

删除文件铜鼓File类的Delete方法来实现的:Delete(string path),永久删除,无法回收站恢复。可以使文件夹,也可以是文件
windows删除操作方式:

  • 键盘上Delete删除(回收站)
  • 鼠标右键删除
  • 运行命令中命令删除(这是永久删除)
    在这里插入图片描述

在这里插入图片描述

using System;
using System.IO;

namespace _7_文件删除
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Admin\Desktop\C#练习\source\";
            Console.WriteLine("请输入您要删除的文件,回车确认:");
            string input = Console.ReadLine();
            string pathTemp = path + input;
            if(File.Exists(pathTemp))
            {
                File.Delete(pathTemp);
                Console.WriteLine("文件删除成功");
            }
            else
            {
                Console.WriteLine("文件不存在");
            }
            Console.ReadKey();

        }
    }
}

8、获得文件基本信息(查看属性)

  • 获取文件的基本信息科通过System.IO命名空间下的FileInfo类来实现,非静态类,需要实例化
  • FieInfo类的许多方法与File类中的对应方法类似,大多数情况并不重要,但是下面的规则有助于确定哪种技术更合适。
    • 如果进行单一方法调用,则可以使用静态File类上的方法,此方式单一调用要快一些,因为.NetFramework不必实例化新对象,再调用方法
    • 如果应用程序在文件上执行集中操作,则实例化FileInfo对象并使用其方法就更好一些。这节省时间,因为对象已在文件系统上引用正确的文件,而静态类必须每次都寻找类。
    • FileInfo类也提供了与底层文件相关的属性,其中一些属性可以用来更新文件,其中很多属性都继承与FileSystemInfo,所以可应用于FileInfo和DirectoryInfo类。

在这里插入图片描述
Attributes:设置相关属性,如只读属性,存档属性,隐藏属性等
Extension:提取文件的扩展名,包含小圆点。
FullName与Name获取的结果是一致的
在这里插入图片描述

using System;
using System.IO;

namespace _8_获取文件的信息
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Admin\Desktop\C#练习\source\c#learnNot.txt";
            FileInfo myfileInfo = new FileInfo(path);
            if(myfileInfo.Exists)
            {
                Console.WriteLine("获取文件属性");
                Console.WriteLine(myfileInfo.Attributes.ToString());
                Console.WriteLine("文件扩展名");
                Console.WriteLine(myfileInfo.Extension.ToString());
                Console.WriteLine("文件全路径为:");
                Console.WriteLine(myfileInfo.FullName.ToString());
                Console.WriteLine("要查看的名称");
                Console.WriteLine(myfileInfo.Name.ToString());
                Console.WriteLine("文件创建时间");
                Console.WriteLine(myfileInfo.CreationTime.ToString());
                Console.WriteLine("文件上次访问时间");
                Console.WriteLine(myfileInfo.LastAccessTime);
                Console.WriteLine("文件上次修改时间");
                Console.WriteLine(myfileInfo.LastWriteTime.ToString());

                Console.WriteLine("文件所在的文件夹为:");
                Console.WriteLine(myfileInfo.Directory.ToString());
                Console.WriteLine(myfileInfo.DirectoryName.ToString());
                Console.WriteLine("文件是否可读:");
                Console.WriteLine(myfileInfo.IsReadOnly);
                Console.WriteLine("文件大小");
                Console.WriteLine(myfileInfo.Length.ToString());

            }
            else
            {
                Console.WriteLine("文件不存在");
            }
            Console.ReadKey();
        }
    }
}

9、文件夹操作之判断是否存在

  • Directory 类用于操作文件夹,用于创建、移动和枚举目录和子目录的静态方法。DirectoryInfo类用于典型操作,如复制、移动、重命名、创建和删除目录。他们都可用于获取和设置相关属性和有管创建、访问以及邪路操作的DataTimen信息。
  • Directory类和DirectoryInfo类同Fie类和FileInfo类,Directroy类是静态方法,DirectoryInfo类是动态方法,使用时必须通过new关键字来创建实例。

9.1 判断文件夹是否存在

判断文件夹是否存在可通过Directory类的Exist方法来实现

using System;
using System.IO;

namespace _9_判断文件夹是否存在
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Admin\Desktop\C#练习\destination";
            if (Directory.Exists(path))
                Console.WriteLine("文件夹存在");
            else
                Console.WriteLine("文件夹不存在");

            Console.ReadKey();
        }
    }
}

10、文件夹创建

创建文件夹可通过Directory类的CreateDirectory方法来实现(判断路径是否存在,捕获异常)
在这里插入图片描述

using System;
using System.IO;

namespace _10_文件夹创建
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Admin\Desktop\C#练习\newfolder\newfolder2"; //可一次创建多层次文件件(newfolder和newfolder2都不存在
            if(Directory.Exists(path))
            {
                Console.WriteLine("文件夹已存在无需创建");
            }
            else
            {
                try
                {
                    Directory.CreateDirectory(path);
                    Console.WriteLine("文件夹创建成功");
                }
                catch (Exception ex)
                {

                    Console.WriteLine("创建失败,原因是:"+ex.ToString());
                }
                
            }
            Console.ReadKey();
        }
    }
}

11、文件夹操作值删除

删除文件夹可通过Directoryl类的Delete方法来实现,删除文件夹前一定要判断文件夹是否存在,否则将会出现错误。(判定文件夹下是否有内容)

using System;
using System.IO;

namespace _11_文件夹删除
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Admin\Desktop\C#练习\newfolder\newfolder2"; //可一次创建多层次文件件(newfolder和newfolder2都不存在
            if(Directory.Exists(path))
            {
                Console.WriteLine("该文件夹存在,请选择删除方式:\n1.文件夹为空时删除;\n2.删除整个目录;\n输入选项数字按回车");
                string mystr = Console.ReadLine();
                if(mystr=="1")
                {
                    Directory.Delete(path, false);  //第二个参数:若要移除 path 中的目录、子目录和文件,则为 true;否则为 false。只有目录中为空时才删除,否则报一出场
                    Console.WriteLine("当前文件夹为空文件,已删除");
                }
                else if(mystr=="2")
                {
                    Directory.Delete(path, true);  //无论文件夹是否为空,均删除
                    Console.WriteLine("当前文件夹含有子文件或子文件夹,已删除");
                }
                else
                {
                    Console.WriteLine("您的操作失误,删除失败");
                }
            }
            else
            {
                Console.WriteLine("文件已经不存在");
            }
            Console.ReadKey();
        }
    }
}

12、文件夹操作之移动

移动文件夹可通过Directory类下的Move方法来实现,当目标文件夹含同名文件夹是,会抛出异常
通过移动文件夹,不仅可改变文件夹的目录,还可以实现对文件夹的重命名。

using System;
using System.IO;

namespace _12.文件夹操作之移动
{
    class Program
    {
        static void Main(string[] args)
        {
            string pathDestination = @"C:\Users\Admin\Desktop\C#练习\destination2";
            string pathsource = @"C:\Users\Admin\Desktop\C#练习\source\";
            if(Directory.Exists(pathsource))
            {
                try
                {
                    Directory.Move(pathsource, pathDestination);
                    Console.WriteLine("文件夹移动成功");
                }
                catch (Exception ex)
                {

                    Console.WriteLine("文件夹移动失败,原因是:" + ex.Message.ToString());

                }
            }
            else
            {
                Console.WriteLine("源文件不存在,无法移动");
            }
            Console.ReadKey();
        }
    }
}

13、获取指定目录下所有文件及文件夹

要想获取单签文件夹下的所有文件,可通过Directory类的GetFiles方法来实现,此方法返回字符串数组

using System;
using System.IO;

namespace _13_获取文件夹下的所有文件及文件夹
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\Admin\Desktop\C#练习\destination";
            if(Directory.Exists(path))
            {
                string[] fileList = Directory.GetFiles(path);
                string[] folders = Directory.GetDirectories(path);
                Console.WriteLine("该指定目录下有以下内容");
                foreach (string file in fileList)
                    Console.WriteLine(file);
                foreach(string folder in folders)
                    Console.WriteLine(folder);                
            }
            else
            {
                Console.WriteLine("指定目录不存在");
            }
            Console.ReadKey();
          
        }
    }
}

14、数据流概述

  • 数据流(也称流)是一个用于传输数据的对象。数据的传输有两个方向,如果是数据从外部源传输到程序中,称为读取流:如果是数据从程序传输到外部源,就称为写入流。
  • System.IO.Stream类是所有流的抽象基类,Stream类及其派生类提供这些不同类型的输入和输出的一般视图,使程序员不必了解操作系统和基础设备的具体细节。
  • 根据基础数据源或储存库,流可能只支持这些功能中的一部分。用户通过使用CanRead、CanWrite和CanSeek属性,可实现应用程序查询流的功能
  • Read和Write方法读写各种不同格式的数据。对于支持查找的流,使用Seek和SetLength方法以及Position和Length属性可以查询和修改流的当前位置和长度。
  • 有些流用于实现执行基础数据的本地缓冲以提高性能,对于这样的流,Flush方法可用于清除所有内部缓冲区并确保所有数据写入基础数据源或存储卡。
  • 在Stream上调用Close将刷新所有经过缓冲处理的数据,本质上为用户调用Flush方法。Close也会释放操作系统资源,如文件句柄、网络连接或用于任何内部缓冲的内存。BufferedStream类提供了将一个经过缓冲的流环绕另一个流功能,以便提高读写性能。
  • 如果需要不带后背存储区(即位存储桶)的流,应使用Null
  • 在实现Stream的培生类是,必须提供Read和Write方法的实现。一步方法BeginRead、EndRead、BeginWrite和EndWtrite通过同步放Read和Write实现。同样Read和Write的实现也将与异步方法一起正常工作。ReadByte和WriteByte的默认实现创建一个新的单元素字节数组,然后调用Read和Write的实现。当从Stream派生时,如果有内部字节缓冲区,则强烈建议重写这些方法,以访问内部缓冲区,这样性能将的到显著提高。
  • 还必须提供CanRead、CanSeek、CANWrite、Flush、Length、Position、Seek和SetLength的实现。不要重写Close方法,而应将所有流清理裸机放入Dispose方法中
  • C#语言中提供的主要数据流类有NetworkStream网络流、BufferedStream缓冲去流、MemoryStream内存流、FileStream文件流、CryptoStream加密流等。

15、文件流FileStream

file类是一次将文件内容全部导入,而FileStream是一次读取一部分,逐渐读入,可以减少内存占有量

  • 文件流FileStream类,是用来实现对文件的读取和写入。FileStream是操作字节的字节数组,当提供向文件读取和写入字节的方法时,常用StreamReader类或StreamWrite类来完成,他们是操作的字符。
  • FileStream类的构造方法有多种形式,最简单的一种FileStream(string,path,FileMode mode)
  • FileMode枚举有几种成员,用于规定如何打开或创建文件,这些成员可以俩呢使用。
    在这里插入图片描述
  • 在不使用FileAccess枚举参数的版本中默认值使用的是ReadWrite
  • 使用场合:如果需要以其他方式打开文件,就要附加一个参数,这个参数为FileAccess参数.FileStream(string path,FileMOnde mode,FileAccess access)
  • 参数有三个枚举值——只读模式(Read)、读写模式(ReadWrite)、只写模式(Write)
  • 作用:基于用户的权限级别改变用户对文件的访问权限
  • File类和FileInfo类提供了OpenRead()方法和OpenWrite方法用于创建FileStream对象,OpenRead()方法用于以只读方式访问文件,OpenWrite()方法则允许对文件进行写入内容操作。
  • Filestream类有三个重要方法,分别为Seek方法、Read方法、Write方法。
  • Seek方法用于直接在文件中查找具体位置
  • FileStream类维护内部文件指针,这会指向文件中的位置。当打开文件时,默认指向文件的开始位置,这里的开始计算位置就是指的这个位置。它是一个SeekOrigin枚举,有二个成员分别为Begin、Current和End。移动距离是相对开始计算的位置而言的,他是以字节为单位。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace 文件操作FileStream类
{
    class Program
    {
        static void Main(string[] args)
        {

            byte[] bufferByte = new byte[100];   //fileStream类是操作字节的,所以创建一个字节数组,以便FileStream使用
            char[] bufferChar = new char[100];   //向文件读取写入是常用StreamReader和StreamWriter来完成,他们是操作字符
            string path = @"C:\Users\Admin\Desktop\C#练习\destination\c#learnNot.txt";  //操作文件的路径
            try
            {
                //一下三种方式打开文件,最常用的是第一种
                //①FileStream类打开文件方式
                FileStream fs1 = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                ②File
                //FileStream fs2 = File.OpenRead(path); //打开现有文件进行读取
                ③FileInfo
                //FileInfo fs3 = new FileInfo(path);  //初始化FileInfo

                //读
                fs1.Seek(0, SeekOrigin.Begin);   //第一个参数偏移量,第二个参数是偏移位置,即从什么位置开始偏移。
                fs1.Read(bufferByte, 0, 100);  //第一个参数是操作的内容,第二个参数是每次偏移多少,第三个参数是每次读取多少个字节,将文件内容读取后存放到BufferByte
                Decoder dc = Encoding.UTF8.GetDecoder();  //解码实例化,
                dc.GetChars(bufferByte, 0, bufferByte.Length, bufferChar, 0);  //将字节转换为相应的字符(将bufferByte字节内容转换为BufferChar), 
                //第二个解码的开始位置,第三个参数是解码的长度,最后一个参数为0是指,解码成功后清除,如果是1解码成功后不清除。
                Console.WriteLine(bufferChar);
                Console.WriteLine("完成读取");
                //写
                bufferChar = "革命尚未成功,同志仍需努力".ToCharArray(); //将字符串转换为字符数组
                Encoder en = Encoding.UTF8.GetEncoder();  //将字符数组转换为字节舒服的实例化对象
                en.GetBytes(bufferChar, 0, bufferChar.Length, bufferByte, 0, true);
                fs1.Seek(0, SeekOrigin.Begin);   //查找文件指针的当前位置,将文件指针定位到当前位置
                fs1.Write(bufferByte, 0, bufferByte.Length);    //写入后,并不是将源内容全部替换,而是按照内容的字节数量进行响应替换
                fs1.Close();
                Console.WriteLine("写入成功");
            }
            catch (Exception ex1)
            {
                Console.WriteLine("操作失败,原因是:"+ex1.ToString());
            }
            Console.ReadKey();
        }
    }
}

16、StreamWriter类

  • FileStream类,该对象只能以字节形式读取/写入数据,这就是的操作非常困难
  • 一般有了FileStream对象,都会借用StreamWriter对象或StreamReader对象的方法来处理文件。
  • 如果不将文件指针改变到任意位置,则使用StreamWriter类或StreamReader类,这样就变得比较容易了。
  • 创建方式
    • ①先创建FileStream对象,然后在创建StreamWriter对象
      • FileStream fs=new FileStream(String path, FileMode monde);
      • StreamWriter sw= new StreamWriter(fs);
    • ②直接从文件中创建StreamWriter对象
      • StreamWriter sw=nwe StreamWriter(string path, boll append)
      • bool append
        • false 表示创建一个新文件或现有文件并将其打开(如果已有文件,相当于删除再创建,即原有内容被删除)
        • true 表示打开文件,保留原来的数据;如果找不到文件则创建一个新文件
  • StreamWriter类的常用方法
    • Close:关闭当前StreamWriter对象和基础流
    • Dispose:释放使用的所有资源
    • Flush:清理当前谢谢器的所有缓冲区,并使所有缓冲数据写入基础流
    • Write :写入流
    • WriteLine :写入指定的某些数据,后跟行结束符
  • StreamWriter类允许将字符和字符串写入文件中,StreamWriter默认使用UTF8Encoding编码,如若使用其他编码,就要构造UTF8Encoding的这个实例是的Encoding.GetPreamble方法返回以UTF8格式编写的Unicode字节
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace _16_StreamWriter类
{
    class Program
    {
        static void Main(string[] args)
        {
            //定义操作文件的路径
            string path = @"C:\Users\Admin\Desktop\C#练习\destination\c#learnNot.txt";
            try
            {
                //方式1
                FileStream fs = new FileStream(path, FileMode.OpenOrCreate); 
                StreamWriter sw = new StreamWriter(fs);
                string mystr = "1、学习C#既轻松有快乐";
                string mystr2 = "2、学习C#既轻松有快乐";
                //sw.Write(mystr);   //写入完成后不换行
                //sw.Write(mystr2);
                sw.WriteLine(mystr);  //写入完成后换行
                sw.WriteLine(mystr2);
                sw.Close();
                //方式2
                StreamWriter sw2 = new StreamWriter(path, false);                
                string mystr3 = "3、学习C#既轻松有快乐";
                string mystr4 = "4、学习C#既轻松有快乐";
                sw2.WriteLine(mystr3);
                sw2.WriteLine(mystr4);
                sw2.Close();
                Console.WriteLine("写入完成");

            }
            catch (Exception ex)
            {
                Console.WriteLine("操作失败,原因是:"+ex.ToString());
            }
            Console.ReadKey();
        }
    }
}

17、StreamReader类

  • StreamReader类用于从文件中读取数据。此类是一个通用类,可用于任何流,构造方法和StreamWriter类格式是一样的,创建方式有两种:
    • ①先创建FileStream类在创建StreamReader类
      • FileStream fs=new FileStream(string path, fileMonde mode)
      • StreamReader st= new StreamReader(fs)
    • ②直接创建StreamReader类
      • StreamReader sr=new StreamReader(String path)
  • Stream Reader类以一种特定的编码输入字符,而Stream类用于字节的输入和输出。使用Stream Reader类可读取标准文本文件的各行信息。StreamReader的默认编码为UTF-8, UTF-8可以正确处理Unicode字符并在操作系统的本地化版本上提供一致的结果。
  • Stream Reader类常用方法
    • Close 关闭当前StreamReader对象和基础流
    • Dispose 释放使用的所有资源
    • Peek 返回下一个可用的字符
    • Read 读取输入流中的下一个字符或下组字符
    • ReadLine 从数据流中读取一行数据,并作为字符串返回
  • 小知识:hosts文件配置软件时,为屏蔽一些网址通过修改hosts文件来实现,文件存放位置:C:\Windows\System32\drivers\etc
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace _17_StreamReader类
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Windows\System32\drivers\etc\hosts";
            string currentline = ""; //用于接收读取的行内容
            if(File.Exists(path))
            {
                //using(){} 此方式能够帮助我们释放流所占用的空间
                //()创建过程,{}读取或写入过程,均不能加分号
                using (StreamReader sr=new StreamReader (path))
                {
                    currentline = sr.ReadLine();  //读取文件第一行
                    while(currentline !=null)     //如果读取到空行代表文件读取完成;
                    {
                        Console.WriteLine(currentline);
                        currentline = sr.ReadLine();
                    }
                }
                //读取完成后 using自动释放流所占用空间
            }
            else
            {
                Console.WriteLine("文件不存在");
            }
            Console.ReadLine();
        }
    }
}

18、文件选择之OPenFileDialog控件

  • OpenFiledialog控件主要用于选择要打开的文件,在使用时可以在属性面板中设置属性,也可以在代码中设置其属性。
  • OpenFileDialog控件的属性
    • InitialDirectory 对话框的初始目录 不设置时,会显示上次打开文件的目录
    • Filter: 要在对话框中显示的文件筛选器,例如文本文件txt
    • FilterIndex:在对话框中选择的文本筛选器的索引,如果选第一项就为1
    • FileName 第一个对话框中显示的文件或最后一个选取的文件
    • Tile 将显示在对话框标题栏中的字符
    • ShowHelp 启用帮助按钮

在这里插入图片描述

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

using System;
using System.IO;
using System.Windows.Forms;

namespace _18_OpenFileDialog控件
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            openFileDialog1.InitialDirectory = @"C:\Users\Admin\Desktop\C#练习\destination";  //设置初始化目录,即打开对话框后的默认路径

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //openFileDialog1.Filter = "文本文件(*.txt)|*.txt";//文件过滤器设置,文件过滤器值必须成对出现,前面部分是用于显示窗体中,后面部分是用于程序的判断
            openFileDialog1.Filter = "文本文件(*.txt)|*.txt|Word文件(*.doc,*.docx)|*.doc;*.docx|所有文件(*.*)|*.*";
            openFileDialog1.FilterIndex = 1;  //设置过滤器索引值 ,用于设置默认打开的文件类型, 根据上面过去器设置此处默认打开是txt文件,如果默认是所有文件则设置为3
            openFileDialog1.Title = "OpenFileDialog对话框的标题";
            openFileDialog1.FileName = "c#learnNot.txt";   //默认打开文件的名称
            openFileDialog1.ShowHelp = true; //显示帮助按钮

            //文件打开后,将文件内容读取的textBox中
            if(openFileDialog1.ShowDialog()==DialogResult.OK)   //判断显示对话框显示及操作动作是打开(即打开了对话框,并选择了打开按钮打开了文件)
            {
                string fName = openFileDialog1.FileName;  //获取选择打开的文件名称
                string fileCon = ""; //用于接收读取的行内容
                //StreamReader sr = new StreamReader(fName, System.Text.Encoding.GetEncoding("gb2312"));//后面参数是定义读取的编码方式
                StreamReader sr = new StreamReader(fName, System.Text.Encoding.GetEncoding("UTF-8"));//后面参数是定义读取的编码方式

                while ((fileCon=sr.ReadLine()) != null)
                {
                    textBox1.Text += fileCon;
                }
                sr.Close();
            }
        }
    }
}

19 文件保存SaveFileDialog控件

  • 保存文件控件由两种情况,一就是保存,二就是另存为,保存很简单,就是在文件已经打开的情况下,再把文件写一遍。
  • 在使用SaveFileDialog控件是,用户可以通过Vs 2015的属性面板设置,也可在代码中设置。
using System;
using System.Windows.Forms;
using System.IO;

namespace _19_SaveFileDialog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            saveFileDialog1.InitialDirectory = @"C:\Users\Admin\Desktop\C#练习\destination";
            saveFileDialog1.Filter = "文本文件(*.txt)|*.txt|97-2003Word文档(*.doc)|*.doc";
            saveFileDialog1.FilterIndex = 1;
            saveFileDialog1.FileName = "C#学习笔记";
            if(saveFileDialog1.ShowDialog()==DialogResult.OK)
            {
                string fName = saveFileDialog1.FileName;
                FileStream fs = File.Open(fName, FileMode.Append);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(richTextBox1.Text);
                sw.Close();
            }

        }
    }
}

在这里插入图片描述

文件夹选择之FolderBrowserDialog控件

  • 应用程序可能只允许用户选择文件夹而非文件,例如在播放MP3时,用户可能把所有的MP3放在一个文件夹内,在添加时,只要选择添加这个文件夹,将会把这个文件内的所有MP3添加到播放器里。在这里对播放器来说,就是只选择了文件夹,而不是文件。这就用到了FolderBrowserDialog控件对话框。
    • FolderBrowserDialog控件对话框属性
    • Description:在对话框中提供描述性的消息
    • RootFolder:指定对话框开始浏览的根文件
    • Selected:指定用户所选的文件
    • ShowNewFolderButton: 指定新文件夹按钮是否显示在对话框中,true显示,false不显示
using System;
using System.Windows.Forms;
using System.IO;

namespace _20_FolderBrowserDialog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.Description = "请选择一个包含有TXT格式的文件件";
            folderBrowserDialog1.RootFolder = Environment.SpecialFolder.Desktop;   //设置默认路径,后面的值是通过系统自带的枚举值来指定路径(Desktop)
            folderBrowserDialog1.ShowNewFolderButton = false;  //设置是否显示新建文件夹按钮
            if(folderBrowserDialog1.ShowDialog()==DialogResult.OK)  //判断用户是否点击了确定/打开的按钮
            {
                string fileName = folderBrowserDialog1.SelectedPath;
                string[] files = Directory.GetFiles(fileName);  //获取指定文件夹下的所有文件
                foreach (string file in files)
                {
                    if(file.Substring(file.LastIndexOf('.')+1).ToLower()=="txt")
                    {
                        richTextBox1.AppendText(file + "\n");

                    }
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.Description = "请选择一个包含有doc格式的文件件";
            folderBrowserDialog1.RootFolder = Environment.SpecialFolder.Desktop;   //设置默认路径,后面的值是通过系统自带的枚举值来指定路径(Desktop)
            folderBrowserDialog1.ShowNewFolderButton = false;  //设置是否显示新建文件夹按钮
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)  //判断用户是否点击了确定/打开的按钮
            {
                string fileName = folderBrowserDialog1.SelectedPath;
                string[] files = Directory.GetFiles(fileName);  //获取指定文件夹下的所有文件
                foreach (string file in files)
                {
                    if (file.Substring(file.LastIndexOf('.') + 1).ToLower() == "doc")
                    {
                        richTextBox1.AppendText(file + "\n");

                    }
                }
            }
        }
    }
}

在这里插入图片描述

21 文件夹监控之FileSystemWatcher

  • FileSystemWatcher控件用来监控一个文件系统或监控文件变化。该控件会通知文件创建、修改、删除的消息,分别通过Created事件、changed事件和Deleted事件、ReNamed事件来处理对应操作。
    • Created:当指定path中创建文件和目录时发生
    • Changed:当更改指定paht中的文件和目录时发生,变更目录或档案的大小,系统属性、上次写入时间,上次存取时间或安全性权限引发。
    • Deleted: 删除指定Path中的文件或目录时发生ReNamed重命名指定path中的文件或目录是发生
  • 常用属性
    • EnableRaisingEvents:获取或设置一个值,该值指示是否启用此组件(true启用监控,false不起用监控)
    • Filter: 获取或设置筛选字符串,用于确定在目录监视哪些文件
    • InculdeSubdirectories :获取或设置一个值,改制指示是否监视指定路径中的子目录
    • InternalBufferSize:获取或这是内部缓冲区的大小
    • Path :获取或设置监视的目录路径
    • SynchronizingObject:获取或设置一个对象,该对象用于调用发送因目录更改的事件处理程序
    • NotifiyFilter:获取或这是重要监视的更改类型,为枚举值,
      • Attributes :文件或文件夹属性
      • CreationTime 文件或文件夹创建时间
      • DirectoryName 文件夹名称
      • FileName:文件名称
      • LastAccess: 文件或文件夹上次打开时间
      • LastWrite:上次向文件或文件夹写入内容的事件
      • Security: 文件或文件夹的安全设置
      • Size:文件或文件夹的大小
    在这里插入图片描述
using System;
using System.Windows.Forms;
using System.IO;

namespace _21_FileSystemWatcher文件监控控件
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            fileSystemWatcher1.EnableRaisingEvents = false;  //窗口加载,先不启动监控
            fileSystemWatcher1.Path = @"C:\Users\Admin\Desktop\C#练习\destination";   //设置监控的路径
            fileSystemWatcher1.Filter = "*.*";//监视所有文件
            fileSystemWatcher1.IncludeSubdirectories = true; //是否包含子目录,即是否监控子目录;
            //监控的相关属性
            fileSystemWatcher1.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite| NotifyFilters.Security | NotifyFilters.Size;
            richTextBox1.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(fileSystemWatcher1.EnableRaisingEvents)
            {
                button1.Text = "启动";
                fileSystemWatcher1.EnableRaisingEvents = false;
            }
            else
            {
                fileSystemWatcher1.EnableRaisingEvents = true;
                button1.Text = "停止";
            }
        }

        private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
        {
            richTextBox1.AppendText(DateTime.Now.ToString() + "更改目录/文件" + Environment.NewLine);
        }

        private void fileSystemWatcher1_Created(object sender, FileSystemEventArgs e)
        {
            richTextBox1.AppendText(DateTime.Now.ToString() + "创建目录/文件" + Environment.NewLine);

        }

        private void fileSystemWatcher1_Deleted(object sender, FileSystemEventArgs e)
        {
            richTextBox1.AppendText(DateTime.Now.ToString() + "删除目录/文件" + Environment.NewLine);

        }

        private void fileSystemWatcher1_Renamed(object sender, RenamedEventArgs e)
        {
            richTextBox1.AppendText(DateTime.Now.ToString() + "重命名目录/文件" + Environment.NewLine);

        }
    }
}

22、多媒体文件的复制

实现多媒体文件的复制

using System;
using System.IO;

namespace _22_多媒体文件的复制
{
    class Program
    {
        // 复制文件的方法
        public static  void CopyFile(string sourcepath, string destinationpath)
        {
            //1、创建一个负责读取的流
            using (FileStream fsRead=new FileStream(sourcepath,FileMode.Open,FileAccess.Read))
            {
                //2、创建一个负责写入的流
                using (FileStream fsWrite=new FileStream(destinationpath,FileMode.OpenOrCreate,FileAccess.Write))
                {
                    //多媒体文件可能会比较大,所以我们在读取文件的时候应该通过一个循环去读取
                    byte[] buffer = new byte[1024 * 1024 * 5]; //每次读取5M的内容,1024为字节,1024个字节为 1M
                    while(true)
                    {
                        //返回本次读取实际读取的字节数
                        int r = fsRead.Read(buffer, 0, buffer.Length);
                        //如果返回一个0,就意味着什么也没有读取到,也就读取完成
                        if (r == 0) break;
                        fsWrite.Write(buffer, 0, r);
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            //思路:现将要复制的多媒体文件读取出来,然后再写入到指定位置
            string sourcepath = @"C:\Users\Admin\Desktop\C#练习\source\1.mp4";
            string targetpath = @"C:\Users\Admin\Desktop\C#练习\destination\2.mp4";
            CopyFile(sourcepath, targetpath);
            Console.WriteLine("多媒体文件被复制成功");
            Console.ReadKey();
        }

    }
}

23、xml文件操作

在C#中创建和读取XML文件

23.1 创建xml文件

using System;
using System.Xml;

namespace _23_xml文件操作
{

    class Program
    {
        public void CreateNode(XmlDocument xmlDoc, XmlNode parentNode, string name, string value)
        {
            XmlNode node = xmlDoc.CreateNode(XmlNodeType.Element, name, null);
            node.InnerText = value;
            parentNode.AppendChild(node);
        }

        public void CreateXmlFile()
        {
            XmlDocument xmlDoc = new XmlDocument(); //实例化xmlDocument对象
            //创建类型声明节点
            XmlNode node = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "");
            xmlDoc.AppendChild(node);
            //创建跟节点
            XmlNode root = xmlDoc.CreateElement("user");
            xmlDoc.AppendChild(root);
            CreateNode(xmlDoc, root, "name", "darly");
            CreateNode(xmlDoc, root, "sex", "male");
            CreateNode(xmlDoc, root, "age", "25");
            try
            {
                xmlDoc.Save(@"C:\Users\Admin\Desktop\C#练习\source\first.xml");
            }
            catch (Exception e)
            {
                //显示错误信息  
                Console.WriteLine(e.Message);
            }
        }
        static void Main(string[] args)
        {
            Program app = new Program();
            app.CreateXmlFile();
            Console.ReadLine();
        }

    }
}

23.2 创建多节点多层级的XML文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace _23._2_创建多节点多层级的XML文件
{
    class Program
    {
        public void CreateNode(XmlDocument xmlDoc, XmlNode parentNode, string name, string value)
        {
            XmlNode node = xmlDoc.CreateNode(XmlNodeType.Element, name, null);
            node.InnerText = value;
            parentNode.AppendChild(node);
        }
        public void CreateXmlFile()
        {
            XmlDocument xmlDoc = new XmlDocument();
            //创建类型声明节点  
            XmlNode node = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "");
            xmlDoc.AppendChild(node);
            //创建根节点  
            XmlNode root = xmlDoc.CreateElement("Users");
            xmlDoc.AppendChild(root);

            XmlNode node1 = xmlDoc.CreateNode(XmlNodeType.Element, "User", null);
            CreateNode(xmlDoc, node1, "name", "xuwei");
            CreateNode(xmlDoc, node1, "sex", "male");
            CreateNode(xmlDoc, node1, "age", "25");
            root.AppendChild(node1);

            XmlNode node2 = xmlDoc.CreateNode(XmlNodeType.Element, "User", null);
            CreateNode(xmlDoc, node2, "name", "xiaolai");
            CreateNode(xmlDoc, node2, "sex", "female");
            CreateNode(xmlDoc, node2, "age", "23");
            root.AppendChild(node2);

            try
            {
                xmlDoc.Save(@"C:\Users\Admin\Desktop\C#练习\source\second.xml");
            }
            catch (Exception e)
            {
                //显示错误信息  
                Console.WriteLine(e.Message);
            }
            //Console.ReadLine();  

        }
        static void Main(string[] args)
        {
            Program app = new Program();
            app.CreateXmlFile();
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值