一、最直观的比较

file和fileinfo都提供对文件的操作
     file类提供静态的方法,file类不能被继承,也不能产生实例,如果只需要使用一次或者次数很少,那么使用file类会比使用fileinfo效率高,但是file类每次都会花时间对方法进行安全检查,而fileinfo只是在实例产生时进行一次检查,以后就不会检查,这样的话,如果需要反复对文件操作,使用fileinfo就会比使用file效率高。

同理directory和directoryinfo也是同样的
       filesysteminfo提供fileinfo和directoryinfo的共有方法,实现对文件或目录进行操作,当不确定操作的对象是文件还是目录时使用filesysteminfo就会很方便。

System.IO包含另一个类File,它的功能与FileInfo一样,不过不同的是,File类成员为静态。所以,使用File代替FileInfo就不必实例化一个新FileInfo对象。 那么为什么有时还使用FileInfo呢?因为每次通过File类调用某个方法时,都要占用一定的cpu处理时间来进行安全检查,即使使用不同的File类的方法重复访问同一个文件时也是如此。而,FileInfo类只在创建FileInfo对象时执行一次安全检查。 File提供的是静态方法,FileInfo提供的是实例方法 Directory、DirectoryInfo类似。如果路径不正确,File会运行不通过,而Directory会输出false。

二、DirectoryInfo和FileInfo详细用法

要注意的是Directory类和File类只是提供了方法,而DirectoryInfo和FileInfo同时提供了方法和属性。

例如:File类有单独的GetAttributes()方法和SetAttribute()方法,而FileInfo类提供了可读写的Attribute属性。

关于DirectoryInfo类和FileInfo类的另外一个好处是它们共享一组属性和方法,

因为它们都是继承自FileSystemInfo基类,此外,

FileInfo和DirectoryInfo类各自有几个独有的成员(具体方法和属性参见msdn)。

创建DirectoryInfo对象和FileInfo对象时,要在构造函数中指定完整的路径。如下所示:
DirectoryInfo directoryInfo = new DirectoryInfo(@"c:\Temp");
FileInfo fileInfo = new FileInfo(@"c:\Temp\readme.txt");
    创建FileInfo和DirectoryInfo对象时,如果指定的路径格式不正确(如包含非法字符)会得到一个异常。不过,路径不需要对应真实的物理文件或目录。如果你不确信,可以用Exists检查文件或目录是否确实存在。
      如果目录或文件不存在,可以用Create()方法创建它们,下面是一个示例:
    DirectoryInfo directoryInfo = new DirectoryInfo(@"c:\Temp\Test");  //创建
    FileInfo fileInfo = new FileInfo(@"c:\Temp\Test\readme.txt");
    directoryInfo.Create();
    FileStream stream = fileInfo.Create();
    stream.Close();
    DirectoryInfo对象和FileInfo对象在你第一次查询某个属性时获取来自文件系统的信息,在后继的使用中它们不再检查新的信息。如果文件此时发生了变化,这会导致不一致性,如果你知道或者怀疑指定对象的文件系统信息被改变了,你可以调用Refresh方法获取最新的信息。
    DirectoryInfo类没有提供任何获取目录大小的属性,不过,你可以累加某一特定目录中每个文件的FileInfo.Length基值来计算该目录的大小。
在执行这一步前,你需要确定是否包含该子目录的大小。下面的方法允许你是用这两种方式中的任意一种:
    private static long CalculateDirectorySize(DirectoryInfo directory,
    bool includeSubdirectories)
    {  long totalSize = 0;                        // Add up each file.
    FileInfo[] files = directory.GetFiles();
    foreach (FileInfo file in files)
    {    totalSize += file.Length;
     }
                                    // Add up each subdirectory, if required.
    if (includeSubdirectories)
    {  DirectoryInfo[] dirs = directory.GetDirectories();
       foreach (DirectoryInfo dir in dirs)
       {  totalSize += CalculateDirectorySize(dir, true);
         }
      }
          return totalSize;
      }
关于剩余空间的信息,需要借助于DriveInfo类。

使用Attributes

FileInfo和DirectoryInfo类的Attributes属性代表文件或目录的文件系统特性。因为每个文件和目录都可以有一组属性。Attributes属性包含一组FileAttributes枚举值(具体见msdn)。
   要找出文件的所有属性,可以调用Attributes属性的ToString()方法,它返回一个逗号分割的特性列表字符串: 
     lblInfo.Text = fileInfo.Attributes.ToString();

测试单个特性时,需要使用位计算,例如考虑下面这段错误的代码:
    if (fileInfo.Attributes == FileAttributes.ReadOnly)
    {  } 
测试仅在当前文件只含有只读特性时才成功。这种情形很少见。如果需要正确检测文件是否错误,只需要下面代码: 
    if ((fileInfo.Attributes & FileAttributes.ReadOnly) != 0)
    {  } 
这个测试成功了,因为它只过滤只读特性。
类似的逻辑允许你验证文件不具备某个特定的特性:
    if ((fileInfo.Attributes & FileAttributes.ReadOnly) != 0)
    {  } 
你还必须用位运算来设置特性。此时,要小心不经意间删除文件原先设置的特性: 
    fileInfo.Attributes = fileInfo.Attributes | FileAttributes.ReadOnly;  //设置只读属性 
    fileInfo.Attributes = fileInfo.Attributes & ~FileAttributes.ReadOnly;  //移除只读属性

某些特性不能通过编程来设置。例如Encrpted特性只有你在Windows中使用EFS(加密文件系统)时才会由操作系统设置

三、方法使用

命名空间:using system .IO;

1. File类:

创建:File.Create(路径);   创建文件,返回FileStream
                      FileStream fs = File.Create(路径);之后需要关闭否则打不开,fs.close();
删除:File.Delete(路径);无返回值
复制文件:File.Copy(源文件,目标文件);
剪切文件:File.Move(源文件路径,目标路径);
判断文件是否存在:File.Exists(路径);   //返回布尔型,true代表已存在
文件加密:File.Encrypt();File.Decrypt();解密
File.GetCreationTime(路径);获取创建时间,返回DateTime类型 SetCreationTime(路径,DateTime类型);修改创建时间
File.GetLastAccessTime(路径);最后访问时间,返回DateTime类型 SetLastAccessTime(路径,DateTime类型);修改访问时间
File.GetLastWriteTime(路径);最后修改时间,返回DateTime类型 SetLastWriteTime(路径,DateTime类型);修改修改时间

写文件:1)边创建边写: FileStream fs = new FileStream(FILE_NAME, FileMode.Create);
                    BinaryWriter w = new BinaryWriter(fs); 
                   for (int i = 0; i < 11; i++ )
                  { w.Write("a");
                  } w.Close();
                   fs.Close();

2)写入已创建:static void Main(string[] args)
                   {  using (StreamWriter w = File.AppendText("test.txt"))
                       {  Log("hehe first", w);
                          Log("hello second", w);
                          w.Close();
                       }
                      }
                public static void Log(string logMessage, TextWriter w)
                {  w.Write("\r\nLog Entry:");
                   w.WriteLine(" :@",logMessage);
                   w.Flush();
               }
————————————————————————————————————————————————————
2. Directory 类,目录(文件夹) 
Directory .CreateDirectory(路径);创建目录
Directory .Delete(路径);删除目录
Directory .Exists(路径);目录是否存在 
三个时间的get和set 
Directory .GetDirectories(路径); 获取子目录,返回string数组
Directory .GetFiles(路径); 获取子文件!名!,返回string数组,string[] s = Directory .GetFiles(路径);
Directory .GetDirectoryRoot(路径); 获取根目录
Directory .GetParent(路径); 获取上一级目录

-------------------------------------------------------------------------------------

FileInfo 类

是实例方法,需要造对象new出来才能用,上面的都是File的静态方法
创建文件:FileInfo f = new FileInfo(路径); FileStream s = f.Create(); s.Close();
删除文件:FileInfo f = new FileInfo(路径); f.Delete();
复制文件:FileInfo f = new FileInfo(路径); f.CopyTo(目标路径,是否覆盖(true是覆盖));
移动文件:FileInfo f = new FileInfo(路径); f.MoveTo(目标路径);
文件是否存在:FileInfo f = new FileInfo(路径); bool b = f.Exists;布尔型,是个属性
获取文件名:FileInfo f = new FileInfo(路径);string s = f.FullName;属性,带路径的文件名
获得创建时间:DateTime d = f.CreationTime,三个时间都一样,都是属性
设置创建时间:f.CreationTime = DateTime.Now.AddDays(100); 三个都一样
获取文件大小:f.Length
_____________________________________________________
DirectoryInfo 类

创建目录:DirectoryInfo d = new DirectoryInfo(路径); d.Create();
删除目录:d.Delete();
移动目录:d.MoveTo(目标路径);
目录是否存在:bool b = d.Exists;
获得目录全名:d.FullName;
获得子文件!对象信息!: FileInfo[] f = d.GetFiles(); 返回的是文件对象数组,内容更详 细,d.GetFiles("*.exe")只获取exe的文件
获得子目录:DirectoryInfo[] dr = d.GetDirectories();

实例展示:读取目录大小

private long size = 0;
private long DirSize(string path)
{
   DirectoryInfo d = new DirectoryInfo(path);
      FileInfo[] f = d.GetFiles();
  foreach (FileInfo wj in f)
   {
     size += wj.Length;
   }

DirectoryInfo[] dr = d.GetDirectories();
if (dr.Count() > 0)
{
foreach (DirectoryInfo wjj in dr)
{
DirSize(wjj.FullName);
}

return size;
}
 
读取目录下面文件夹数量: 
private int dcount = 0;
private int DirCount(string path)
{  DirectoryInfo d = new DirectoryInfo(path); 
   DirectoryInfo[] dr = d.GetDirectories(); 
 if (dr.Count() > 0)
 {  foreach (DirectoryInfo wjj in dr)
  {
    DirCount(wjj.FullName);
  }

dcount += dr.Count(); 
return dcount;
}
 
读取所有文件数量: 
private int count=0;
private int FileCount(string path)
{
  DirectoryInfo d = new DirectoryInfo(path);

FileInfo[] f = d.GetFiles(); 
  DirectoryInfo[] dr = d.GetDirectories();
   if (dr.Count() > 0)
   {  foreach (DirectoryInfo wjj in dr)
    {
        FileCount(wjj.FullName);
     }
   } 
   count += f.Count(); 
    return count;
}
 
利用遍历集合查询文件夹下所有文件数量,文件夹数量:

private int fcount = 0;
private int FileCount(string path)
{

DirectoryInfo dwjj = new DirectoryInfo(path);  //造文件夹信息对象

fcount += dwjj.GetFiles().Length;  //取当前文件夹下文件数量

foreach (DirectoryInfo d in dwjj.GetDirectories())  //取当前目录下所有文件夹
{
    FileCount(d.FullName);
}
return fcount;

private int dcount = 0;
private int DirCount(string path)
{
DirectoryInfo d = new DirectoryInfo(path);  //造一个文件夹信息对象

DirectoryInfo[] df = d.GetDirectories(); //取该目录下所有文件夹

dcount += df.Length;  //累加文件夹数量

foreach (DirectoryInfo w in df)  //遍历所有文件夹
{
DirCount(w.FullName);
}
return dcount;
}

FileInfo和DirectoryInfo相关推荐

  1. File,FileInfo,Directory,DirectoryInfo

    两者的共同点:   一:都用于典型的操作,如复制.移动.重命名.创建.打开.删除和追加到文件    二:默认情况下,将向所有用户授予对新文件的完全读/写访问权限.   两者的区别:    File类是 ...

  2. C#之Directory类、DirectoryInfo类和Fileinfo,File以及FilesSystemInfo

    一 两者的共同点 都用于典型的操作,如复制.移动.重命名.创建.打开.删除和追加到文件 默认情况下,将向所有用户授予对新文件的完全读写访问权限. 二 两者的区别 File类是静态类,由于所有的File ...

  3. C# File、FileInfo、Directory、DirectoryInfo

    本文主要介绍文件类.文件信息类.目录类.目录信息类的常用属性和方法 1.File(文件类) // 1.判断文件是否存在 bool isFileExist = File.Exists(@"D: ...

  4. File,FileInfo;Directory,DirectoyInfo的区别

    曾经看过有文章说FileInfo.DirectoryInfo类主要用于文件.目录的属性,操作功能不强云云,似乎有忘文生义的嫌疑.     也说说自己的学习体会:     一.    File,Dire ...

  5. C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表

    OpenFileDialog openFileDialog1 = new OpenFileDialog(); if(openFileDialog1.ShowDialog() == DialogResu ...

  6. C#文件操作基础之File类和FileInfo类

    文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...

  7. C#中DirectoryInfo类、目录信息类、文件夹信息类的用法

    一.file和fileinfo都提供对文件的操作 ①file类提供静态的方法,file类不能被继承,也不能产生实例,如果只需要使用一次或者次数很少,那么使用file类会比使用fileinfo效率高,但 ...

  8. C#经验:C#File和FileInfo类的使用

    文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们常常想到目录路径,磁盘存储,文件和目录名等方面. I/O流提供一种后备存储写入字节和 ...

  9. 路径,文件,目录,I/O常见操作汇总

    摘要:    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案 ...

最新文章

  1. WCF RIA Service中 POCO实体含有复杂类型怎么处理?
  2. 一次看完2019技术好文,快收藏!
  3. hdu 3812 Sea Sky 深搜+剪枝
  4. 中文正则表达式初步使用
  5. 51nod1244 欧拉函数之和 杜教筛
  6. 谷歌18年博士生奖研金出炉,八位入选华人学生均毕业于国内高校
  7. 手把手教你入门Git --- Git使用指南(Linux)
  8. 玩转Nacos参数配置!多图勿点
  9. LeetCode算法入门- Add Two Numbers-day3
  10. python求数字平均值_Python简单计算数组元素平均值的方法示例
  11. 【直播预告】腾讯广告实时策略数据框架建设
  12. sql:Mysql create view,function,procedure
  13. 三路快排C++实现与应用
  14. [Android] View控件显示隐藏动画效果
  15. UDS协议-代码完整性测试
  16. Win7连接蓝牙4.0鼠标
  17. 西南民族大学计算机院方导师,暨南大学信息科学技术学院导师教师师资介绍简介-高博宇...
  18. 苹果app无法打开显示无法连接服务器,无法连接到app store是什么原因?苹果应用商店打不开的解决方法...
  19. 数据压缩作业:JPEG原理分析及JPEG解码器的调试
  20. 【总结】从0到1的项目经历

热门文章

  1. 《计算之魂》阅读笔记 02
  2. 简单聊聊网络空间测绘纵横之道
  3. sscanf用法详解
  4. 大学英语综合教程一 Unit1至Unit8 课文内容英译中 中英翻译
  5. mysql安装 root account password_mysql 配置 安装和 root password 更改
  6. flash动画制作的几个小技巧
  7. 佛陀的道路是要体验实相
  8. 2009年终网店系统盘点
  9. 如何通过 SAP ABAP OData $expand 操作在同一个 HTTP 请求中返回多个节点的数据试读版
  10. java短路_什么是java编程思想中程的短路现象?