C#目录与文件总结

来源:互联网 发布:linux ant安装配置 编辑:程序博客网 时间:2024/04/29 21:35

注:C#的文件操作都是包含在System.Io的命名空间里面。


一、 Path类
对一个路径做相应操作,包括文件路径,目录路径。通常会用到Path这个类。
1.更改路径字符串的扩展名
Public  static  string  ChangeExtension(string  path,string  extension)
参数:
path(String):要修改的路径信息.
extension(String):新的扩展名。
返回值:String,修改后的路径字符串。
注意细节:a、如果 extension 是 null,则返回的字符串包含指定的路径,其扩展名已移除(点还在)。string s =Path.ChangeExtension(@"c:\path.dll", "");//返回:"c:\path."b、如果 path 是 null 或空字符串 (""),则返回的路径信息是未修改的。string s2 = Path.ChangeExtension("", ".txt");//返回:""C、如果 path 不具有扩展名,并且 extension 不是 null,则返回的路径字符串包含 extension,它追加到 path 的结尾。string s3 = Path.ChangeExtension(@"c:\目录", ".txt");//返回:"c:\目录.txt"。 如果这里的extension不含句点,会自动添加,返回的还是"c:\目录.txt"
2、合并两个字符路径字符串
public static string Combine(string path1,string path2)
    参数:
path1(String) ,第一个路径
path2(String), 第二个路径
返回值:String ,合并后的路径字符串。
常见的合并操作为:
string path1 = @"c:\目录";
string path2 = @"install.txt";
string s4 = Path.Combine(path1, path2);
//返回:"c:\目录\install.txt"
   3.获取指定路径字符串的目录信息
   public static string GetDirectoryName(string path)
   直接看几个示例了:
string fileName = @"C:\mydir\myfile.ext";
string path = @"C:\mydir\";
string rootPath = @"C:\";

Path.GetDirectoryName(fileName);
//返回:'C:\mydir'
Path.GetDirectoryName(path);
//返回:'C:\mydir'
Path.GetDirectoryName(rootPath);
//返回:””
4.获取指定路径字符串的扩展名
public static string GetExtension(string path)
string fileName = @"C:\mydir.old\myfile.ext";
string path = @"C:\mydir.old\";
Path.GetExtension(fileName);
//返回 : '.ext'
Path.GetExtension(path);
//返回 :' '


二、File类和FileInfo类
File类和FileInfo类的区别和使用方法.,两者的主要区别是File不能实例化,只提供静态方法,而后者可以实例化,提供的方法和File类相似. C#语言中通过File和FileInfo类来创建、复制、删除、移动和打开文件。在File类中提供了一些静态方法,使用这些方法可以完成以上功能,但File类不能建立对象。FileInfo类使用方法和File类基本相同,但FileInfo类能建立对象。在使用这两个类时需要引用System.IO命名空间。这里重点介绍File类的使用方法。
1、简单介绍些方法
AppendText:返回StreamWrite,向指定文件添加数据;如文件不存在,就创建该文件。
 Copy:复制指定文件到新文件夹。
Create:按指定路径建立新文件
Delete:删除指定文件。
Exists:检查指定路径的文件是否存在,存在,返回true。
GetAttributes:获取指定文件的属性。
GetCreationTime:返回指定文件或文件夹的创建日期和时间。
GetLastAccessTime:返回上次访问指定文件或文件夹的创建日期和时间。
GetLastWriteTime:返回上次写入指定文件或文件夹的创建日期和时间。
Move:移动指定文件到新文件夹。
Open:返回指定文件相关的FileStream,并提供指定的读/写许可。
OpenRead:返回指定文件相关的只读FileStream。
OpenWrite:返回指定文件相关的读/写FileStream。
SetAttributes:设置指定文件的属性。
SetCretionTime:设置指定文件的创建日期和时间。
SetLastAccessTime:设置上次访问指定文件的日期和时间。
SetLastWriteTime:设置上次写入指定文件的日期和时间。


2、下面通过程序实例来介绍其主要方法:
(1)文件打开方法:File.Open
该方法的声明如下:public static FileStream Open(string path, FileMode mode)。
下面的代码打开存放在c:\Example目录下名称为e1.txt文件,并在该文件中写入hello。
FileStream  TextFile=File.Open(@"c:\ Example\e1.txt",FileMode.Append);
byte []  Info={(byte)'h',(byte)'e',(byte)'l',(byte)'l',(byte)'o'};
TextFile.Write(Info,0,Info.Length);
TextFile.Close();
(2)文件创建方法:File.Create
该方法的声明如下:public  static  FileStream  Create(string path)。下面的代码演示如何在c:\Example下创建名为e1.txt的文件。
FileStream  NewText = File.Create(@"c:\Example\e1.txt");
NewText.Close();
(3)文件删除方法:File.Delete
该方法声明如下:public static void Delete(string path)。下面的代码演示如何删除c:\Example目录下的e1.txt文件。
File.Delete(@"c:\Example\e1.txt");
(4)文件复制方法:File.Copy
该方法声明如下:
public static void Copy(string  sourceFileName,string  destFileName,bool  overwrite);
下面的代码将c:\Example\e1.txt复制到c:\Example\e2.txt。由于Cope方法的OverWrite参数设为true,所以如果e2.txt文件已存在的话,将会被复制过去的文件所覆盖。
File.Copy(@"c:\Example\e1.txt",@"c:\Example\e2.txt",true);
(5)文件移动方法:File.Move
该方法声明如下:public  static  void  Move(string  sourceFileName,string destFileName);下面的代码可以将c:\Example下的e1.txt文件移动到c盘根目录下。注意:只能在同一个逻辑盘下进行文件转移。如果试图将c盘下的文件转移到d盘,将发生错误。
File.Move(@"c:\Example\BackUp.txt",@"c:\BackUp.txt");
(6)判断文件是否存在的方法:File.Exist
该方法声明如下:public static bool Exists(string path);下面的代码判断是否存在c:\Example\e1.txt文件。
if(File.Exists(@"c:\Example\e1.txt"))//判断文件是否存在
(7)得到文件的属性
用下面的代码可以得到文件的属性,例如文件创建时间、最近访问时间、最近修改时间等等。
FileInfo fileInfo=new FileInfo(“file1.txt”);
string s=fileInfo.FullName+”文件长度=”+fileInfo.Length+”,建立时间=”+ fileInfo.CreationTime+”;
也可用如下代码:
string s=”建立时间=”+File.File.GetCreationTime(“file1.txt”)+”最后修改时间=”+ File.GetLastWriteTime(“file1.txt”)+”访问时间=”+File.GetLastAccessTime(“file1.txt”);

 

三、Directory类和DirectoryInfo类
Directory类来创建、复制、删除、移动文件夹。在Directory类中提供了一些静态方法,使用这些方法可以完成以上功能。但Directory类不能建立对象。DirectoryInfo类使用方法和Directory类基本相同,但DirectoryInfo类能建立对象。在使用这两个类时需要引用System.IO命名空间。这里重点介绍Directory类的使用方法。
Directory类常用的方法如下:
CreateDirectory:按指定路径创建所有文件夹和子文件夹。
Delete:删除指定文件夹。
Exists:检查指定路径的文件夹是否存在,存在,返回true。
GetCreationTime:返回指定文件或文件夹的创建日期和时间。
GetCurrentDirectory:获取应用程序的当前工作文件夹。
GetDirectories:获取指定文件夹中子文件夹的名称。
GetDirectoryRoot:返回指定路径的卷信息、根信息或两者同时返回。
GetFiles:返回指定文件夹中子文件的名称。
GetFileSystemEntries:返回指定文件夹中所有文件和子文件的名称。
GetLastAccessTime:返回上次访问指定文件或文件夹的创建日期和时间。
GetLastWriteTime:返回上次写入指定文件或文件夹的创建日期和时间。
GetLogicalDrives:检索计算机中的所有驱动器,例如A:、C:等等。
GetParent:获取指定路径的父文件夹,包括绝对路径和相对路径。
Move:将指定文件或文件夹及其内容移动到新位置。
SetCreationTime:设置指定文件或文件夹的创建日期和时间。
SetCurrentDirectory:将应用程序的当前工作文件夹设置指定文件夹。
SetLastAccessTime:设置上次访问指定文件或文件夹的日期和时间。
SetLastWriteTime:设置上次写入指定文件夹的日期和时间。


3、下面通过程序实例来介绍其主要方法:
(1)目录创建方法:Directory.CreateDirectory
方法声明如下:public  static  DirectoryInfo  CreateDirectory(string path);
下面的代码演示在c:\Dir1文件夹下创建名为Dir2子文件夹。
Directory.CreateDirectory(@"c:\Dir1\Dir2");
(2)目录属性设置方法:DirectoryInfo.Atttributes
下面的代码设置c:\Dir1\Dir2目录为只读、隐藏。与文件属性相同,目录属性也是使用FileAttributes来进行设置的。
DirectoryInfo  DirInfo=new  DirectoryInfo(@"c:\Dir1\Dir2");
DirInfo.Atttributes=FileAttributes.ReadOnly
FileAttributes.Hidden;
(3)目录删除方法:Directory.Delete
该方法声明如下:public  static  void Delete(string  path,bool  recursive);
下面的代码可以将c:\Dir1\Dir2目录删除。Delete方法的第二个参数为bool类型,它可以决定是否删除非空目录。如果该参数值为true,将删除整个目录,即使该目录下有文件或子目录;若为false,则仅当目录为空时才可删除。
Directory.Delete(@"c:\Dir1\Dir2",true);
(4)目录移动方法:Directory.Move
该方法声明如下:public  static  void  Move(string sourceDirName,string destDirName);下面的代码将目录c:\Dir1\Dir2移动到c:\Dir3\Dir4。
File.Move(@"c:\Dir1\Dir2",@"c:\Dir3\Dir4");}
(5)获取当前目录下所有子目录:Directory.GetDirectories
该方法声明如下:public  static  string[] GetDirectories(string path;);下面的代码读出c:\Dir1\目录下的所有子目录,并将其存储到字符串数组中。
string [] Directorys;   Directorys = Directory. GetDirectories (@"c:\Dir1");
获得所有逻辑盘符:
string[] AllDrivers=Directory.GetLogicalDrives();
(5)判断目录是否存在方法:Directory.Exist
该方法声明如下:public static bool Exists(string path;);
下面的代码判断是否存在c:\Dir1\Dir2目录。
if(File.Exists(@"c:\Dir1\Dir2"))//判断目录是否存在


四、文件监视类:FileSystemWatcher
侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。可借助FileSystemWatcher会更简单些。
1、属性:
(1)Path--这个属性告诉FileSystemWatcher它需要监控哪条路径。例如,如果我们将这个属性设为“C:\test”,对象就监控test目录下所有文件发生的所有改变(包括删除,修改,创建,重命名)。
(2)IncludeSubDirectories--这个属性说明FileSystemWatcher对象是否应该监控子目录中(所有文件)发生的改变。
(3)Filter--这个属性允许你过滤掉某些类型的文件发生的变化。例如,如果我们只希望在TXT文件被修改/新建/删除时提交通知,可以将这个属性设为“*txt”。在处理高流量或大型目录时,使用这个属性非常方便。
(4)NotifyFilter--获取或设置要监视的更改类型。可以进一步的过滤要监控的更改类型:如watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
2、事件:
(1)Changed--当被监控的目录中有一个文件被修改时,就提交这个事件。值得注意的是,这个事件可能会被提交多次,即使文件的内容仅仅发生一项改变。这是由于在保存文件时,文件的其它属性也发生了改变。
(2)Created--当被监控的目录新建一个文件时,就提交这个事件。如果你计划用这个事件移动新建的事件,你必须在事件处理器中写入一些错误处理代码,它能处理当前文件被其它进程使用的情况。之所以要这样做,是因为Created事件可能在建立文件的进程释放文件之前就被提交。如果你没有准备正确处理这种情况的代码,就可能出现异常。
(3)Deleted--当被监控的目录中有一个文件被删除,就提交这个事件。
(4)Renamed--当被监控的目录中有一个文件被重命名,就提交这个事件。
注:如果你没有将EnableRaisingEvents设为真,系统不会提交任何一个事件。如果有时FileSystemWatcher对象似乎无法工作,请首先检查EnableRaisingEvents,确保它被设为真。
3、事件处理
当FileSystemWatcher调用一个事件处理器时,它包含两个自变量--一个叫做“sender”的对象和一个叫做“e”的 FileSystemEventArgs对象。我们感兴趣的自变量为FileSystemEventArgs自变量。这个对象中包含有提交事件的原因。以下是FileSystemEventArgs对象的一些属性:
属性:
(1)Name--这个属性中使事件被提交的文件的名称。其中并不包含文件的路径--只包含使用事件被提交的文件或目录名称。
(2)ChangeType--这是一个WatcherChangeTypes,它指出要提交哪个类型的事件。其有效值包括:Changed,Created,Deleted,Renamed
(3)FullPath--这个属性中包含使事件被提交的文件的完整路径,包括文件名和目录名。
注意:FileSystemEventArgs对象是监控文件夹下有文件创建、删除、修改时的自变量,如果是重命名的话为RenamedEventArgs对象此时除了FileSystemEventArgs对象的属性值,多了一个OldFullPath,为重命名之前的文件名。


五、文件的读取和写入文件
1、流的概念:在.net FrameWork中进行的所有的输入输出工作都需要使用流.流是串行化设备的抽象表示.串行化设备可以以线性方式存储数据,并可以以同样的方式访问:一次访问一个字节.此设备可以是磁盘文件,打印机,内存位置或任何其他支持以线性方式读写的对象.通过使用设备抽象,就可以隐藏流的基础性的目标或源.这种抽象的级别使得代码可以重用,允许我们编写更通用的程序.因此,当程序从文件输入流或网络输入流读取数据时,就可以转换并重用类似的代码.而且,通过使用流,我们还可以忽略每一种设备的物理机制.因此为了从文件流中读取文件,我们无须担心磁盘开销或内存分配等问题
C# 中Stream类是所有流的抽象基类,它可以为流提供一般性视图,从而使得开发人员不需要了解I/O设备的具体细节。与流相关的操作包括以下3个基本操作。
读取流:即读取流中的内容。
写入流:即将指定的内容写入到流中。
流支持查找:即可以查找或设置流的当前位置。
与流相关的、最为常用的类包括Stream类、FileStream类(文件流,常用于操作文件)、MemoryStream类(内存流,常用来操作内存中的数据)和BufferedStream类(缓存流,用来操作缓存中的数据)。其中Stream类为抽象类,FileStream类、MemoryStream类和BufferedStream类从直接继承于Stream类,它们是实体类。
2、 使用FileStream类管理文件数据
先看几个例子:
(1) 使用FileStream流写入文本文件:
static void Main(string[] args)
{
      string str = "hello world";
       string strPath = @"D:\test.txt";
       FileInfo fileStr = new FileInfo(strPath);
       byte[] strWrite = new UTF8Encoding(true).GetBytes(str);
       FileStream StrStream=fileStr.Create();
       StrStream.Write(strWrite, 0, strWrite.Length);
      Console.WriteLine("写入成功!");
      StrStream.Close();
}
(2)使用MemoryStream类管理内存数据
    static void Main(string[] args)
    {
      string str = "你好!"
      byte[] MermoryWrite = new UTF8Encoding(true).GetBytes(str);
      //在内存中申请适合的空间
      MemoryStream ms = new MemoryStream(MermoryWrite.Length);
      //写入内存缓冲区
      ms.Write(MermoryWrite, 0, MermoryWrite.Length);
      //打印出当前流的位置
      Console.WriteLine(ms.Position);
      //清空缓冲区
      ms.Flush();
      //seek属于定位指针函数,第一个参数它是相对于第二个参数的位置,也相当于偏移量。第二个参数是它用作查找参考点。
      //返回值:流内的新位置,通过将初始参考点和偏移量合并计算而得。
      ms.Seek(0, SeekOrigin.Begin);
      byte[] temp = new byte[MermoryWrite.Length];
      // 从当前流中读取字节块并将数据写入 buffer 中。返回写入缓冲区中的总字节数。
      ms.Read(temp, 0, (int)ms.Length);
      Console.WriteLine(new UTF8Encoding(true).GetChars(temp));
        }      
}
(2) 使用BufferedStream来提高流的性能
 static void Main(string[] args)
        {
            string str = "你好!";
            string strPath = @"D:\test.txt";
            FileInfo fileStr = new FileInfo(strPath);
            byte[] strWrite = new UTF8Encoding(true).GetBytes(str);
            FileStream StrStream = fileStr.Create();

            //实例化缓冲区
            BufferedStream bufferStr = new BufferedStream(StrStream);
            //向缓冲区中写入流
            bufferStr.Write(strWrite, 0, strWrite.Length);
            bufferStr.Close();
            StrStream.Close();
            Console.WriteLine("写入成功!");    
        }
3、 管理应用程序数据
(1) 管理文本数据用StreamReader和StreamWriter,它们继承与抽象类TextReader类和TextWriter类,这点注意不要用错了。
如:读取D:\test.txt文件
static void Main(string[] args)
        {
            string strPath = @"D:\test.txt";          
            //写入文件
            StreamWriter sw=new StreamWriter(File.Open(strPath,FileMode.Append));
            sw.WriteLine(DateTime.Now.ToString());
            //注意清空缓冲区和关闭流对象
            sw.Flush();
            sw.Close();

            //从文件中读取数据
            StreamReader sr=new StreamReader(File.Open(strPath,FileMode.Open));
            Console.WriteLine(sr.ReadToEnd());
 }
(2) 管理字符串数据用StringReader类和StringWriter类,注意用到StringBuilder
        static void Main(string[] args)
        {          
            //写入字符串
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);      
            sw.WriteLine(DateTime.Now.ToString());

            //注意清空缓冲区和关闭流对象
            sw.Flush();
            sw.Close();

            //从文件中读取数据
            StringReader sr = new StringReader(sb.ToString());
            Console.WriteLine(sr.ReadToEnd());

}
(3) 管理二进制文件用BinaryReader类和BinaryWriter类,注意需要一个stream对象
        static void Main(string[] args)
        {
            string strPath = @"D:\test.dat";          
            //写入二进制文件         
  BinaryWriter bw=new BinaryWriter(File.Open(strPath,FileMode.OpenOrCreate));
            bw.Write(true);;
            bw.Write('A');
            //注意清空缓冲区和关闭流对象
            bw.Flush();
            bw.Close();
            //从文件中读取数据
            BinaryReader br = new BinaryReader(File.Open(strPath, FileMode.Open));
            Console.WriteLine(br.ReadBoolean());           
            Console.WriteLine(br.ReadChar());           
}

注:以上这些类都是继承于Stream类的
(4).NET Framework的字符编码类:在这里不再赘述,可以查msdn(<http://msdn.microsoft.com/zh-cn/ms404377>)

(5)扩展下,高效处理字符串
看一下如下代码:
    string str="";
    for (int i = 0; i < 1000; i++)
     {
       str += i.ToString();     
  }
字符串是引用类型,这样将会有999个空间是浪费的,所以为了提高效率引用StringBuilder,而不仅仅是合并。
以上代码可以改为:
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < 1000; i++)
     {
        str.Append(i.ToString());     
  }
这样效率就会大大提高。

原创粉丝点击