C# 文件操作系列一

在.Net环境中,所有关于文件操作的类都在System.IO命名空间下,注:在修改文件时,安全性显得格外重要,但是本随笔不过多讲述安全性,这里假设我们有足够的权限。

1、管理文件系统

先通过一幅图来了解整个文件系统的关键类

(1)、System.MarshalByRefObject类:这是.Net类中用于远程操作的基对象类,它允许在应用程序域之间编组数据.

(2)、FileSystemInfo类:这是任何文件系统对象的基类

(3)、Path类:这个类包含的静态成员可以用于处理路径名

(4)、DriveInfo类:它的属性和方法提供了指定驱动器的信息

(5)、Directory和DirectoryInfo类:这些类表示文件系统上的文件夹

(6)、FileInfo和File类:这些类表示文件系统上的文件

上图中有两个表示文件夹的类,两个表示文件的类,具体用哪个类取决于访问文件夹和文件的次数。

(7)、Directory类和File类与DirectoryInfo和FileInfo类的区别

Directory类和File类这两个类是静态类,所以不能实例化,如果只对文件或者文件夹执行一个操作,使用这两个类就很好,因为能省去实例化的开销。

DirectoryInfo和FileInfo类实现与Directory类和File类大致相同的公共方法,并拥有一些公共属性和构造函数,但它们都是有状态的,且这些类的成员都不是静态的。需要实例化这些类。如果一个对象执行多个操作,那么使用这两个类就比较方便。因为在构造时,将读取合适文件系统对象的身份和其他的一些信息,无论对象(类实例)调用了多少方法,都不需要再次读取这些信息。相比之下.Directory类和File类两个无状态类则需要再次读取相应的文件系统的信息。

(8)File类与FileInfo类的区别

下面通过简单的复制文件,来比较两者的区别,代码如下:

FileInfo类

Stopwatch sw = new Stopwatch();
sw.Start();
FileInfo info = new FileInfo(@"C:\Users\Administrator\Desktop\project\MVC\C#高级编程(第9版):C#5.0 & .NET 4.5.1_13698151.pdf");
info.CopyTo(@"C:\Users\Administrator\Desktop\Test\C#高级编程(第9版):C#5.0 & .NET 4.5.1_13698151.pdf",true);
sw.Stop();
TimeSpan ts = sw.Elapsed;
string Elapsed = string.Format("{0:00}:{1:00}:{2:00}:{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
Console.WriteLine("The total running hours is {0}", Elapsed);
Console.ReadLine();

File类

Stopwatch sw = new Stopwatch();
sw.Start();
File.Copy(@"C:\Users\Administrator\Desktop\project\MVC\C#高级编程(第9版):C#5.0 & .NET 4.5.1_13698151.pdf", @"C:\Users\Administrator\Desktop\Test\C#高级编程(第9版):C#5.0 & .NET 4.5.1_13698151.pdf", true);
sw.Stop();
TimeSpan ts = sw.Elapsed;
string Elapsed = string.Format("{0:00}:{1:00}:{2:00}:{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
Console.WriteLine("The total running hours is {0}", Elapsed);
Console.ReadLine();

如果不知道Stopwatch类的用法请参考Stopwatch类学习

通过上面的代码实例发现使用静态类File程序执行的时间更少,因为系统省去了实例化的实例化的时间

(9)Exists属性

该属性FileInfo和DirectoryInfo都实现了,该属性用于判断文件和文件夹是否存在,如果传入的路径表示一个不存在的对象,当通过FileInfo和DirectoryInfo初始化一个对象时都会传递一个路径,通过这种方法构造时并不会抛出异常,但是第一次调用方法时就会抛出异常,所以这种情况下,通过Exists属性来检查文件和文件夹是否存在是十分必要的,如果通过Exists属性接茬通过之后,就可以查看当前实例的其他属性,具体的属性如下:

注:创建时间和最后一次访问时间、最后一次写入时间都是可写入的。

除了查看属性之外,还可以对文件系统对象执行操作,具体的操作列表如下:

    上面只是一部分常用的操作,并不是FileInfo和DirectoryInfo实例所有的方法和属性。读写文件实际上是使用流对象完成,FileInfo也可以实现Open()、OpenRead()、OpenWrite()、OpenText()、Create()、CreateText()等操作,为此他们返回的都是流对象。

(10)、Path类是一个静态类,该类不能实例化,它提供了一些静态方法,可以更容易的对路径名进行操作,比如说Combine方法就支持若干个路劲的合并,使用Path类要比手动处理各个符号要容易的多,特别是Path类能处理不同操作系统上的路径名,虽然.Net只支持Windows平台。下面是Path类的部分属性和方法

下面通过一个窗体应用程序,来展示关于文件的操作,以下是操作界面:                         点击下载源码

文件移动:

        /// <summary>
        /// 文件移动
        /// </summary>
        protected void FileMove()
        {
            try
            {
                string filepath = Path.Combine(_currentDirectory, textBox2.Text);
                string query = "Really move the file\n" + filepath + "\n to" + textBox8.Text + "?";
                if (MessageBox.Show(query, "Move File?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    File.Move(filepath, textBox8.Text);
                    DisplayFolderList(_currentDirectory);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Unable to move file.The follow exception" + "occured:\n" + ex.Message, "Failed");
            }
        }

文件复制:

        protected void FileCopy()
        {
            try
            {
                string filepath = Path.Combine(_currentDirectory, textBox2.Text);
                string query = "Really copy the file\n" + filepath + "\n to " + textBox8.Text + "?";
                if (MessageBox.Show(query, "Copy File?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    File.Copy(filepath, textBox8.Text);
                    DisplayFolderList(_currentDirectory);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Unable to copy file.The follow exception" + "occured:\n" + ex.Message, "Failed");
            }
        }    

文件删除:

        protected void FileDelete()
        {
            try
            {
                string filepath = Path.Combine(_currentDirectory, textBox2.Text);
                string query = "Really delete the file\n" + filepath + "?";
                if (MessageBox.Show(query, "Delete File?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    File.Delete(filepath);
                    DisplayFolderList(_currentDirectory);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Unable to delete file.The follow exception" + "occured:\n" + ex.Message, "Failed");
            }
        }

展示文件信息:

        /// <summary>
        /// 展示文件信息
        /// </summary>
        /// <param name="path">文件路径</param>
        protected void DisplayFileInfo(string path)
        {
            
            if (path.Equals(string.Empty))
            {
                MessageBox.Show("请输入文件的路径!");
                return;
            }
            FileInfo info = new FileInfo(path);
            if (!info.Exists)
            {
                throw new FileNotFoundException("File Not Found" + path);
            }
            else
            {
                textBox2.Text = info.Name;
                textBox3.Text = info.Length.ToString() + "bytes";
                textBox4.Text = info.CreationTime.ToLongDateString();
                textBox5.Text = info.LastWriteTime.ToLongDateString();
                textBox6.Text = info.LastAccessTime.ToLongDateString();
            }
        }

显示目标文件夹的所有信息:

        protected void DisplayFolderList(string path)
        {
            DirectoryInfo info = new DirectoryInfo(path);
            if (path.Equals(string.Empty))
            {
                MessageBox.Show("请输入文件夹的路径!");
                return;
            }
            if (!info.Exists)
            {
                throw new FileNotFoundException("File Not Found" + path);
            }
            else
            {
                Clear();
                textBox7.Text = info.FullName;
                _currentDirectory = info.FullName;
                foreach (var innerFolder in info.GetDirectories())
                {
                    listBox2.Items.Add(innerFolder.Name);
                }
                foreach (var file in info.GetFiles())
                {
                    listBox1.Items.Add(file.Name);
                }
            }
        }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏yukong的小专栏

【SpringBoot2.0系列11】SpringBoot之@Elasticsearch完成CURD

【SpringBoot系列02】SpringBoot之使用Thymeleaf视图模板

6803
来自专栏finleyMa

GraphQL 分享 实战篇

三种基本操作 Query(a read‐only fetch), Mutation(a write followed by a fetch), Subscrip...

2694
来自专栏菩提树下的杨过

Silverlight:Dependency Property(依赖属性)学习笔记

学习SL/WPF,Dependency Properties(依赖属性)是一个全新(陌生)但又无法回避的概念。 http://www.wpftutorial.n...

2037
来自专栏JavaEE

thumbnails图像处理库的使用前言:thumbnails的使用:

4863
来自专栏大内老A

Model验证系统运行机制是如何实现的?

在前面三篇文章(《ModelValidator》、《ModelValidatorProvider》和《ModelValidatorProviders》)中我们详...

19410
来自专栏林德熙的博客

win10 uwp 如何使用DataTemplate 转换绑定Event到Command绑定 ObservableCollectionDataTemplate 绑定 ViewM

这是数据模板,一般用在数组的绑定,显示数组中的元素。 假如我们有一个列表,列表里是书,包括书名、作者、还有出版,那么我们只有源信息,如何把它显示到我们的List...

1852
来自专栏游戏杂谈

使用vbscript替换excel文件的内容

这个不能算瞎折腾,也算是被逼的没办法了。从接手webgame开始,看到那么多的excel文件被翻译为繁体,我的头就没小过。现在因为新版本的问题又得重新翻译一次...

2262
来自专栏君赏技术博客

Jekyll-Admin-Mac-列表

接下来我们需要就是做出这个列表数据,我们可以使用 NSTableView来做出这个效果。

1621
来自专栏我的小碗汤

mysql数据导出golang实现

https://github.com/go-sql-driver/mysql/wiki/Examples

1433
来自专栏抠抠空间

Django之Form表单

Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们...

4096

扫码关注云+社区

领取腾讯云代金券