在.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);
}
}
}

C# 文件读写系列二

C# 文件操作系列一的更多相关文章

  1. Day05 (黑客成长日记) 文件操作系列

    文件操作: 1.以什么编码方式输出,就以什么编码方式打开 f = open('d:\文件操作.txt',mode='r',encoding='GB2312') G = f.read() print(G ...

  2. Java文件操作系列[3]——使用jacob操作word文档

    Java对word文档的操作需要通过第三方组件实现,例如jacob.iText.POI和java2word等.jacob组件的功能最强大,可以操作word,Excel等格式的文件.该组件调用的的是操作 ...

  3. Java文件操作系列[2]——使用JXL操作Excel文件

    由于java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现.支持Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL. 总体来说,二者的区别 ...

  4. Windows phone开发之文件夹与文件操作系列(一)文件夹与文件操作

    Windows phone7中文件的存储模式是独立的,即独立存储空间(IsolatedStorage).对文件夹与文件操作,需要借助IsolatedStorageFile类. IsolatedStor ...

  5. C#文件操作系列(一)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  6. Java文件操作系列[1]——PDFBox实现分页提取PDF文本

    需求:用java分页提取PDF文本. PDFBox是一个很好的可以满足上述需求的开源工具. 1.PDF文档结构 要解析PDF文本,我们首先要了解PDF文件的结构. 关于PDF文档,最重要的几点: 一, ...

  7. C# 文件读写系列二

    读取文件原则上非常简单,但它不是通过FileInfo和DirectoryInfo来完成的,关于FileInfo和DirectoryInfo请参考C# 文件操作系列一,在.Net Framework4. ...

  8. python递归、collections系列以及文件操作进阶

    global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults log global mode http t ...

  9. Python学习系列(五)(文件操作及其字典)

    Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件      在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...

随机推荐

  1. 咏南LINUX中间件

    咏南LINUX中间件 什么是跨平台? DELPHI跨平台已经不是停留在理论,而是可以实用了. 同一套中间件既能在WINDOWS服务器上面部署,又可以在LINUX服务器上面部署. 而做到这一切,只需要一 ...

  2. Android-FileIOUtils工具类

    文件读写相关工具类 public final class FileIOUtils { private FileIOUtils() { throw new UnsupportedOperationExc ...

  3. java提示找不到或无法加载主类

    背景 默许jdk的配置大家都没有问题,执行java,javac无报错,但今天在尝试在本地起来kafka的时候,提示java 找不到或无法加载主类,然后日志中提示 Files 找不到或无法加载主类:C: ...

  4. 修改Tomcat的jvm的垃圾回收GC方式为CMS

    修改Tomcat的jvm的垃圾回收GC方式 cp $TOMCAT_HOME/bin/catalina.sh $TOMCAT_HOME/bin/catalina.sh.bak_20170815 vi $ ...

  5. C#文字转换语音朗读或保存MP3、WAV等格式

    最近遇到一个需求,需要把文字转换语音,参考很多大佬写的方法,最后经过自己改造实现文字在线朗读.保存MP3.WAV等格式. //需要引用System.Speech程序集 //引用using System ...

  6. MaxScript镜像函数

    看到有网友需要写的,其实镜像就是缩放改为负数 Fn MirrorObject argObjects argAxisName = ( local axisNames = #(#x,#y,#z) do ( ...

  7. 【题解】 洛谷P2340 奶牛会展

    传送门 重新开始打代码Day1 第一眼看感觉不对啊,这道题目好像空间开不下,是不是不能dp... 后来想到了一个思路,他要求的是\(dp_{i,j,k}=j+k\),然后这样子不是很奇怪吗? 直接一维 ...

  8. Robolectric 单元测试中使用 Ressource

    单元测试类中: @RunWith(RobolectricGradleTestRunner.class) @Config(constants=BuildConfig.class, sdk = 21) 获 ...

  9. Android ScrollView 子控件不占满的问题

    经常碰到很笨的 ScrollView的子控件无法占满 ScrollView 的空间的问题. 其实只需要加一行,android:fillViewport="true" 但不加上这行就 ...

  10. GO学习笔记 - 包内首字母大写的名称是被导出的,才能被其它包代码调用!

    在GO语言的任意包内,如果名称的首字母是大写的,意味着这个名称被导出,在其它包中可以使用“包名.名称”方式来调用,如果名称首字母不是大写,那么只能在这个包内部使用!这个概念还真是和以往接触的编程语言的 ...