C#WinForm DriveInfo磁盘驱动器类 +FileInfo 文件属性操作 +Path类 文件路径操作+using语句 自动释放资源

一、知识点简介

DriveInfo是C#中专门用于获取本地磁盘驱动器信息的工具类,隶属于System.IO命名空间。该类可以读取电脑盘符的总容量、剩余可用空间、磁盘格式、磁盘类型、磁盘名称、根目录等相关硬件信息。

该类作用:实现软件检测磁盘容量、判断磁盘类型、检测存储空间是否充足,常见于文件管理系统、安装程序、磁盘监控项目中。

二、完整源代码

复制代码
using System;
using System.IO;
using System.Windows.Forms;

namespace _7DriveInfo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //主要获取相关驱动器的 一些信息(驱动器剩余的空间, 驱动器类型等)

            //1.实例化磁盘驱动器对象,指定需要查询的C盘
            DriveInfo info = new DriveInfo(@"c:\");

            //2.调用属性,获取磁盘各项信息并打印在控制台
            Console.WriteLine(info.AvailableFreeSpace);//获取剩余空间(字节为单位)
            Console.WriteLine(info.DriveType); //获取驱动器类型
            Console.WriteLine(info.DriveFormat);//获取磁盘文件系统格式
            Console.WriteLine(info.Name);//获取驱动器名称
            Console.WriteLine(info.RootDirectory);//获取驱动器根目录
            Console.WriteLine(info.TotalSize);//获取驱动器总容量
        }
    }
}

三、代码逐段拆分详解

1、实例化DriveInfo磁盘对象

复制代码
DriveInfo info = new DriveInfo(@"c:\");

创建DriveInfo类实例对象,参数填写磁盘盘符路径;本案例传入c:\,表示绑定电脑C盘,用于后续获取C盘所有相关信息。可修改为D盘、E盘进行查询。

2、AvailableFreeSpace 属性

复制代码
Console.WriteLine(info.AvailableFreeSpace);

作用:获取当前磁盘可用剩余空间;计量单位为字节(Byte),需要自行换算成MB、GB。

3、DriveType 属性

复制代码
Console.WriteLine(info.DriveType);

作用:获取驱动器类型;返回枚举值,可区分硬盘、U盘、光驱、移动磁盘,固定硬盘返回Fixed类型。

4、DriveFormat 属性

复制代码
Console.WriteLine(info.DriveFormat);

作用:获取磁盘文件系统格式;电脑硬盘一般为NTFS格式,U盘常见FAT32、exFAT格式。

5、Name 属性

复制代码
Console.WriteLine(info.Name);

作用:获取当前驱动器的盘符名称,例如C盘、D盘。

6、RootDirectory 属性

复制代码
Console.WriteLine(info.RootDirectory);

作用:获取磁盘的根目录路径,C盘根目录即为C:\。

7、TotalSize 属性

复制代码
Console.WriteLine(info.TotalSize);

作用:获取磁盘的整体总容量,计量单位同样为字节(Byte)。

四、单位换算公式(拓展)

由于所有容量属性默认返回字节,日常查看需要换算:

1KB = 1024Byte

1MB = 1024KB

1GB = 1024MB

五、执行流程

1、程序初始化窗体;

2、创建DriveInfo对象,绑定指定磁盘盘符;

3、读取磁盘剩余空间、总大小、磁盘格式、类型、盘符名称、根目录;

4、所有数据输出至控制台,方便开发者查看磁盘信息。

六、知识点总结

1、DriveInfo专门用于检测电脑磁盘驱动器的各项硬件信息;

2、必须通过构造方法传入盘符路径,绑定对应磁盘;

3、AvailableFreeSpace剩余空间、TotalSize总大小,单位默认字节;

4、DriveFormat获取磁盘格式,DriveType判断磁盘设备类型;

5、Name获取盘符名称,RootDirectory获取磁盘根目录路径。

七、易错点

1、传入不存在的盘符,程序直接抛出异常;

2、直接使用字节数值阅读不方便,忘记单位换算;

3、读取光驱且光驱无光盘时,获取容量属性会报错;

4、未引用System.IO命名空间,无法使用DriveInfo类。

------------------FileInfo 文件属性操作------------------------

一、知识点简介

FileInfo 属于文件实例类,需要使用 new 实例化对象,专门用来获取和设置单个文件/文件夹的全部详细属性。

区别:File 是静态类,适合快速简单操作;FileInfo 是实例类,适合长期对同一个文件进行多次操作,能够获取文件详细信息(大小、后缀、创建时间、隐藏、只读等)。

主要功能:获取文件完整路径、文件大小、后缀名、创建时间、修改时间、访问时间、设置文件隐藏/只读/存档属性。

二、完整源代码

复制代码
using System;
using System.IO;
using System.Windows.Forms;

namespace _8文件属性操作
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //1、实例化文件对象,绑定指定txt文件
            FileInfo info = new FileInfo(@"C:\Users\Administrator\Desktop\新建文本文档 (2).txt");
            Console.WriteLine(info.Attributes); //获取文件特性

            //2、实例化文件夹对象,绑定桌面文件夹
            FileInfo info1 = new FileInfo(@"C:\Users\Administrator\Desktop\img");
            Console.WriteLine(info1.Attributes);//获取文件夹特性

            //3、第一种方式:通过FileInfo对象设置文件特性(只读+隐藏)
            //info.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden;

            //4、第二种方式:静态File类设置文件特性
            File.SetAttributes(@"C:\Users\Administrator\Desktop\新建 DOC 文档.doc", FileAttributes.Hidden);

            //5、获取文件各项详细属性
            Console.WriteLine(info.FullName);       //完整路径
            Console.WriteLine(info.Name);           //文件名称
            Console.WriteLine(info.Extension);      //文件后缀
            Console.WriteLine(info.CreationTime);   //创建时间
            Console.WriteLine(info.LastWriteTime);  //最后修改时间
            Console.WriteLine(info.LastAccessTime); //最后访问时间
            Console.WriteLine(info.Directory);      //所在文件夹路径
            Console.WriteLine(info.Exists);         //判断文件是否存在
            Console.WriteLine(info.Length);         //文件大小(字节)
        }
    }
}

三、代码分段详细拆解

第一段:实例化FileInfo对象

复制代码
FileInfo info = new FileInfo(@"C:\Users\Administrator\Desktop\新建文本文档 (2).txt");

作用:根据指定绝对路径,实例化文件对象;后续所有属性查询、属性修改,都针对该文件进行操作。

第二段:Attributes 获取文件特性

复制代码
Console.WriteLine(info.Attributes);

1、Archive:默认属性,普通存档文件;

2、Directory:代表当前对象是文件夹;

3、ReadOnly:只读属性;

4、Hidden:隐藏属性。

第三段:绑定文件夹对象

复制代码
FileInfo info1 = new FileInfo(@"C:\Users\Administrator\Desktop\img");
Console.WriteLine(info1.Attributes);

FileInfo不仅可以操作文件,也可以操作文件夹;文件夹属性默认显示 Directory(目录)。

第四段:第一种设置文件特性(FileInfo方式)

复制代码
info.Attributes = FileAttributes.ReadOnly|FileAttributes.Hidden;

通过 | 符号可以给文件同时添加多个特性,该代码作用:将文件设置为只读并且隐藏。

第五段:第二种设置文件特性(File静态方式)

复制代码
File.SetAttributes(@"文件路径",FileAttributes.Hidden);

直接调用File静态方法,无需实例化对象,适合一次性设置文件属性。

配套方法:File.GetAttributes() 获取文件特性。

第六段:文件所有常用属性详解

复制代码
Console.WriteLine(info.FullName);       //获取文件完整绝对路径
Console.WriteLine(info.Name);           //获取文件名称(包含后缀)
Console.WriteLine(info.Extension);      //获取文件后缀名 .txt .exe
Console.WriteLine(info.CreationTime);   //获取文件创建时间
Console.WriteLine(info.LastWriteTime);  //获取文件最后修改时间
Console.WriteLine(info.LastAccessTime); //获取文件最后访问时间
Console.WriteLine(info.Directory);      //获取文件所在文件夹路径
Console.WriteLine(info.Exists);         //判断文件是否存在,返回true/false
Console.WriteLine(info.Length);         //获取文件大小,单位字节

四、File 和 FileInfo 区别

1、File:静态类,不需要new,适合一次性简单操作(创建、删除、复制);

2、FileInfo:实例类,必须new对象,适合长期操作同一个文件,可以获取详细文件属性。

五、文件常用特性枚举

Archive:普通存档文件(所有新建文件默认属性);

ReadOnly:只读,用户无法修改内容;

Hidden:隐藏文件,桌面无法直接看见;

Directory:标识该对象为文件夹。

六、知识点总结

1、FileInfo 必须实例化,专门获取文件详细属性;

2、Attributes属性可以获取、设置文件隐藏、只读、存档特性;

3、设置多属性使用 | 连接多个枚举值;

4、修改文件属性有两种方式:FileInfo对象方式、File静态SetAttributes方式;

5、Length获取文件大小,单位为字节,需要换算GB/MB;

6、Exists判断文件是否存在,防止路径报错。

七、易错点

1、文件路径写错,直接报找不到文件异常;

2、设置Hidden隐藏后,桌面看不到文件,无法直接双击打开;

3、文件设置只读之后,无法写入、修改内容;

4、Length只能获取文件大小,文件夹无法获取大小;

5、多个属性之间必须使用 | 符号,不能直接赋值覆盖原有属性。

------------------------Path类 文件路径操作------------------------

一、知识点简介

Path类属于静态工具类,位于System.IO命名空间,专门用于处理文件、文件夹路径字符串

Path类不会对文件进行读写、创建、删除操作,只负责对路径字符串进行拆分、拼接、获取文件名、获取后缀、修改后缀、转换绝对路径等操作。所有方法都是静态方法,直接通过Path.方法名调用。

二、完整源代码

复制代码
using System;
using System.IO;
using System.Windows.Forms;

namespace _9文件路径的操作
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Path:提供获取文件或者目录的路径信息,专门操作路径字符串

            //定义文件路径
            string filePath = @"C:\Users\Administrator\Desktop\新建 DOC 文档.doc";
            //定义文件夹路径
            string FilePath = @"C:\Users\Administrator\Desktop\img";

            //获取绝对路径
            Console.WriteLine(Path.GetFullPath(filePath));
            Console.WriteLine(Path.GetFullPath(FilePath));

            //获取文件名(带后缀)
            Console.WriteLine(Path.GetFileName(filePath));
            //获取文件后缀名
            Console.WriteLine(Path.GetExtension(filePath));

            //修改文件后缀
            string ss = Path.ChangeExtension(filePath, ".jpg");
            Console.WriteLine(Path.GetExtension(ss));

            //将数组元素拼接成完整路径
            string[] s1 = new string[] { "C:\\", "Users", "Administrator", "文档.doc" };
            Console.WriteLine(Path.Combine(s1));
        }
    }
}

三、代码分段拆解讲解

1、定义路径字符串

复制代码
string filePath = @"C:\Users\Administrator\Desktop\新建 DOC 文档.doc";
string FilePath = @"C:\Users\Administrator\Desktop\img";

分别定义一条文件完整路径、一条文件夹完整路径,用于后续所有路径测试方法。

2、GetFullPath() 获取绝对路径

复制代码
Console.WriteLine(Path.GetFullPath(filePath));

作用:返回该文件/文件夹对应的完整绝对路径。绝对路径就是从电脑盘符开始的完整路径,程序开发中最常用。

3、GetFileName() 获取文件名

复制代码
Console.WriteLine(Path.GetFileName(filePath));

作用:获取路径中最后的文件名称,包含扩展名,例如:新建 DOC 文档.doc。

4、GetExtension() 获取文件后缀

复制代码
Console.WriteLine(Path.GetExtension(filePath));

作用:单独获取文件的后缀扩展名,返回值包含小数点,例如:.doc、.txt、.jpg。

5、ChangeExtension() 修改文件后缀

复制代码
string ss = Path.ChangeExtension(filePath,".jpg");

作用:修改当前路径字符串的后缀名;不会修改本地真实文件,仅仅只是修改字符串,返回新路径。

6、Combine() 路径拼接(重点)

复制代码
string[] s1 = new string[] { "C:\\", "Users", "Administrator", "文档.doc" };
Console.WriteLine(Path.Combine(s1));

作用:自动根据系统规则拼接路径,自动补充分隔符 \,避免手动拼接路径出现斜杠多余或缺失的BUG;支持传入字符串数组,一次性拼接多级目录。

四、Path类常用方法汇总

1、GetFullPath():获取完整绝对路径;

2、GetFileName():获取文件名(带后缀);

3、GetExtension():获取文件后缀扩展名;

4、ChangeExtension():修改路径后缀名;

5、Combine():智能拼接路径,开发最常用;

6、GetDirectoryName():获取文件所在文件夹路径。

五、知识点总结

1、Path是静态类,全部方法为静态方法,无需new对象;

2、Path只操作路径字符串,不会影响电脑本地真实文件;

3、绝对路径:从盘符开始;相对路径:相对于当前程序Debug目录;

4、修改后缀ChangeExtension只改字符串,不会改变真实文件格式;

5、拼接路径优先使用Combine,不要手动写斜杠拼接,兼容性更强。

六、易错点

1、Path类只能操作字符串,不能创建、删除、修改真实文件;

2、ChangeExtension仅修改路径文本,不会重命名本地文件;

3、手动拼接路径容易多斜杠、少斜杠,建议统一使用Combine;

4、GetFileName对文件夹路径使用,会获取不到任何数据。

------------------using语句 自动释放资源------------------------

一、知识点简介

using语句是C#专门用来自动释放资源的语法,主要针对所有流对象(FileStream、StreamReader、StreamWriter、BufferedStream等)。

普通流操作写完代码必须手动调用Close()关闭、Dispose()释放资源;使用using语法后,程序执行超出using大括号范围时,会自动帮我们销毁流对象、释放文件资源,无需手动写关闭与释放代码,简化代码并且避免忘记关闭文件导致文件被占用的BUG。

二、完整源代码

复制代码
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

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

            //定义需要写入的字符串
            string s = "aaabvbbv哈兰德";
            //字符串转字节数组
            byte[] bs = Encoding.Default.GetBytes(s);

            #region using写入文件(追加模式)
            //using自动管理FileStream资源
            using (FileStream fs = new FileStream(@"1.txt",FileMode.Append))
            {
                //将字节数组写入文件末尾
                fs.Write(bs, 0, bs.Length);
            }
            #endregion

            #region using读取文件(只读模式)
            //创建接收数据的缓存字节数组
            byte[] rece = new byte[1024 * 1024 * 5];
            using (FileStream fs = new FileStream(@"1.txt", FileMode.Open))
            {
                //读取文件数据,返回实际读取的字节长度
                int l = fs.Read(rece, 0, rece.Length);
                //字节数组还原为字符串
                string ss = Encoding.Default.GetString(rece, 0, l);
                //控制台输出 + 弹窗展示数据
                Console.WriteLine(ss);
                MessageBox.Show(ss);
            }
            #endregion
        }
    }
}

三、代码逐段拆分详解

1、数据初始化

复制代码
string s = "aaabvbbv哈兰德";
byte[] bs = Encoding.Default.GetBytes(s);

1、定义需要写入文件的字符串内容;

2、计算机底层只能识别字节,通过编码将字符串转为byte字节数组;

3、Encoding.Default代表使用电脑系统默认编码格式。

2、using 追加写入文件

复制代码
using (FileStream fs = new FileStream(@"1.txt",FileMode.Append))
{
    fs.Write(bs,0,bs.Length);
}

(1)using作用原理

在using括号内实例化流对象,该对象属于块级作用域,仅能在当前{}内部使用;代码执行完毕跳出大括号,系统自动调用Dispose()释放资源,不需要手动写Close()和Dispose()。

(2)FileMode.Append 追加模式

① 文件存在:直接打开文件,光标默认定位在文件末尾,写入内容直接追加,不会覆盖旧数据;

② 文件不存在:自动创建全新的1.txt文件;

③ 权限限制:Append模式仅支持写入,不支持读取文件数据。

(3)Write写入方法

将转换好的字节数组全部写入当前文件流中。

3、using 读取文件

复制代码
byte[] rece = new byte[1024*1024*5];
using (FileStream fs = new FileStream(@"1.txt", FileMode.Open))
{
   int l = fs.Read(rece,0,rece.Length);
   string ss =  Encoding.Default.GetString(rece,0,l);
   Console.WriteLine(ss);
   MessageBox.Show(ss);
}

1)创建缓存数组

初始化5M字节数组作为缓冲区,用来临时存储读取到的文件数据。

(2)FileMode.Open 打开模式

打开指定文件,主要用于读取操作,如果文件不存在直接报错。

(3)Read读取数据

读取文件内容存入缓存数组,返回值int代表本次真实读取到的字节数量。

(4)编码还原

通过Encoding.Default.GetString,将字节数组还原为原始字符串,最后通过控制台和弹窗展示内容。

四、using语句核心优点

1、自动释放资源:执行完大括号内代码,自动销毁流对象;

2、精简代码:不用重复书写Close()、Dispose();

3、安全性高:杜绝忘记关闭文件流,导致文件被锁定、无法删除的问题;

4、作用域隔离:using内部变量外部无法访问,规范代码结构。

五、FileMode.Append与Create区别

1、Create:覆盖模式,文件存在直接清空原有内容,重新写入;

2、Append:追加模式,保留旧数据,在文件末尾新增内容;

3、Append只能用于写入,不能用于读取。

六、整体执行流程

1、将字符串转为字节数组;

2、using+Append模式打开文件,追加写入数据,执行完毕自动释放写入流;

3、重新以Open模式打开文件,读取全部内容;

4、字节数组转字符串,弹窗展示;

5、读取结束自动释放读取流资源。

七、易错点

1、using内部声明的流对象,大括号外部无法使用;

2、Append模式不能读取文件,强行读取直接报错;

3、区分Create(覆盖)和Append(追加),防止误删原有数据;

4、using仅支持实现IDisposable接口的类(所有文件流都支持)。