• C#的基础琐碎总结目录与文件


    注: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());     
      }
    这样效率就会大大提高。

    简单先写这么多吧,权当复习下。

  • 相关阅读:
    三元运算
    sys and os
    print.format
    while loop
    线段树模板
    Round #431 (Div.2)
    D. Make a Permutation!
    Round #411 (Div.2)
    Round #432 (Div.2)
    Round #433 (Div.2)
  • 原文地址:https://www.cnblogs.com/fuchongjundream/p/2429356.html
Copyright © 2020-2023  润新知