FileInfo和DirectoryInfo

来源:互联网 发布:淘宝换类目 编辑:程序博客网 时间:2024/05/20 01:35

一、最直观的比较

     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;
}
































0 0
原创粉丝点击