zoukankan      html  css  js  c++  java
  • C#

    文件操作 File Operation

    程序中所有数据都以流的形式进行传输,流分字节流和字符流。读取文件就是输入流,保存到文件就是输出流,操作Unicode编码的数据就是处理以两个字节为单位的字符流,操作以一个字节为单位的数据就是处理字节流,前者输入到string变量以便操作,后者则输入到byte数组变量以便操作(byte数组的每个元素就是8个位,也即每个单位都是一个字节)。一个文档保存的数据其实都是以byte进行存储,也即存储的都是二进制数据,txt文档存储的自然也是二进制数据。但同样一个字符,用不同的编码方式所得到的二进制数据是不一样的,比如txt总是默认用ASCII编码方式将字符编码为ASCII的二进制数据,也有使用十进制的Unicode编码方式将字符编码为Unicode的二进制数据。当字符是以Unicode进行编码后存储在txt中,然后你用txt将其打开,会发现乱码,这正是因为txt默认使用ASCII编码对二进制数据进行解码造成的。编程的方式打开文件后,可以利用下面提供的类型来读取文件中的数据,可以按字符或字节读取。

     

    UnicodeEncoding类

    提供方法将Unicode字节序列转换为Unicode字符或将Unicode字符转换为Unicode字节序列,类似的有ASCIIEncoding。

    GetBytes(char[] charArray)
    //获取字符的字节序列,返回一个byte[]数组
    //示例:
    UnicodeEncoding encoding = new UnicodeEncoding();
    byte[] strByte = encoding.GetBytes("hello word!".ToCharArray());

    GetString(byte[] strByte)
    //示例:
    UnicodeEncoding encoding = new UnicodeEncoding();
    byte[] strByte = encoding.GetBytes("hello word!".ToCharArray());
    encoding.GetString(strByte);

    Stream类

    提供对字节流的读写操作,它是以字节的形式操作数据。

    FileStream类

    提供对文件字节流的读写操作,它从Stream派生,同样是以字节的形式操作数据。无构造函数,只能靠File或FileInfo类的打开文件的方法(Open()等方法)创建。

    MemoryStream类

    此类用于向内存读写数据而非向文件读写数据。提供对内存中的字节流的读写操作,它从Stream派生,同样是以字节的形式操作数据

    //写入内存流           
    MemoryStream memory = new MemoryStream(new byte[20]); //内存大小          
    UnicodeEncoding unicode = new UnicodeEncoding();
    byte[] strByteArray = unicode.GetBytes("hello word");//将字符串编码为字节序列,存入字节数组   
    memory.Write(strByteArray, 0, strByteArray.Length);//将整个字节序列写入内存

    //读取内存流            
    memory.Seek(0SeekOrigin.Begin);
    byte[] byteArray = new byte[memory.Length];            
    int count = memory.Read(byteArray, 0, strByteArray.Length);//将读取的数据存入字节数组,返回字节总数            
    char[] charArray = new char[unicode.GetCharCount(byteArray, 0, count)];//解码字节数组,将结果字符存入char数组
    unicode.GetDecoder().GetChars(byteArray, 0, count, charArray, 0);
    string result = new string(charArray);
    Console.WriteLine(result);

    BinaryReader和BinaryWriter类

    BinaryReader基于文件流或网络流提供读取二进制值,BinaryWriter基于字符流提供写入二进制值。要初始化BinaryReader只需要提供流数据,初始化BinaryWriter提供字符串。类似的还有StreamReader和StreamWriter,这两个类提供方法根据文件的编码方式读取文件中的数据为字符或将字符写入文件。

    string str = "hello";

    //创建UTF8的二进制文件
    FileStream fs = new FileStream( @"E:Binary.bin", FileMode.Create );
    BinaryWriter writer = new BinaryWriter( fs );
    byte[] bytes = Encoding.UTF8.GetBytes( str );//以UTF8编码方式将str转换为UTF8的二进制数据
    writer.Write( bytes );
    writer.Close( );
    fs.Close( );

    //读取UTF8的二进制文件
    FileStream fs2 = new FileStream( @"E:Binary.bin", FileMode.Open );
    BinaryReader reader = new BinaryReader( fs2 );
    byte[] strByte = reader.ReadBytes( bytes.Length );
    string data = Encoding.UTF8.GetString( strByte );//以UTF8编码方式读取UTF8的二进制文件,以什么编码写入就以什么编码读取           
    Console.WriteLine( data );

    //以StreamReader读取UTF8的二进制文件
    StreamReader streamReader = new StreamReader( fs2 );
    string strData = streamReader.ReadToEnd( ); //此方法自动根据文件的编码方式读取文件中的二进制数据为字符
    Console.WriteLine( data );

    Path类

    Path.GetInvalidPathChars()
    //获取默认的关于文件夹路径可能的非法字符列表,返回一个char[]存储这些内置的非法字符

    Path.GetInvalidFileNameChars();
    //获取默认的关于文件路径可能的非法字符列表,返回一个char[]存储这些内置的非法字符

    File

    与FileInfo的区别在于,此类提供操作文件的静态方法,而FileInfo需要创建实例,如果频繁操作文件,应考虑使用FileInfo。File类没有任何属性,它只提供一个FileAttributes枚举来表示文件的属性,而FileInfo类则提供了N多个属性来表示文件的属性。

    Open(string path, FileMode model, FileAccess access)
    //打开一个文件,返回一个FileStream对象。如果文件不存在则通过FileMode指定应创建该文件
    //-------FileMode枚举可能的值如下:-------
    //CreateNew:创建新文件,如果文件已经存在,则引发IOException;
    //Create:创建新文件,如果文件已经存在,原文件将被覆盖;
    //Open:打开现有文件,如果文件不存在,则引发FileNotFoundException;
    //OpenOrCreate:打开文件,如果文件不存在,则创建新文件;
    //Truncate:打开现有文件,文件一旦打开,就将截断为零字节大小;
    //Append:打开先有文件并把指针移动至文件尾,如果文件不存在将创建新文件。此枚举值必须同FileAccess.Write一起使用
    //-------FileAccess枚举可能的值如下:-------
    //Read:只读;
    //Write:只写;
    //ReadWrite:读写;
    //示例:
    FileStream stream = File.Open(@"d:/test.txt"FileMode.OpenOrCreate, FileAccess.ReadWrite);
    UnicodeEncoding encoding = new UnicodeEncoding();
    byte[] strByte = encoding.GetBytes("hello word!".ToCharArray());
    stream.Write(strByte, 0, strByte.Count());


    //以下两个方法都是以只读的方式打开文件,都返回一个FileStream对象
    OpenRead、OpenWrite

    //以下三个方法都是打开文件并全部读取后关闭
    ReadAllBytes、ReadAllLines、ReadAllText

    //以下三个方法都是创建一个文件并全部写入后关闭
    WriteAllBytes、WriteAllLines、WriteAllText

    ReadLines(String str | String str, Encoding encoding)
    //读取文件的行
    //示例:
    foreach (string line in File.ReadLines(@"d: est.txt"))
    {
        if (line.Contains("episode"& line.Contains("2006"))
        {
            Console.WriteLine(line);
        }
    }

    //此类还提供了操作文件的其它方法:
    //AppendAllLines(追加)、Copy(拷贝)、Move(移动)、
    //Create(创建)、Delete(删除)、Encrypt(加密)、Decrypt(解密)
    //Exists(是否存在)、Replace(用另一个文件的内容替换当前文件的内容)、
    //Get / SetAttributes(设置或获取属性)、Get / SetCreationTime(设置或获取创建时间)、Get / SetLastAccessTime(获取或设置最近一次访问的时间)

    FileInfo类

    除了具有File的方法以外,它提供一系列的属性来表示文件的属性。 

    Attributes
    //获取或设置当前文件或目录的特性

    CreationTime
    //获取或设置当前文件或目录的创建时间

    CreationTimeUtc
    //获取或设置当前文件或目录的创建时间,其格式为协调世界时(UTC)

    Directory
    //获取父目录的实例。

    DirectoryName
    //获取表示目录的完整路径的字符串

    Exists
    //获取指示文件是否存在的值。(覆盖 FileSystemInfo.Exists)

    Extension
    //获取表示文件扩展名部分的字符串

    FullName
    //获取目录或文件的完整目录

    IsReadOnly
    //获取或设置确定当前文件是否为只读的值

    LastAccessTime
    //获取或设置上次访问当前文件或目录的时间

    LastAccessTimeUtc
    //获取或设置上次访问当前文件或目录的时间,其格式为协调世界时(UTC)

    LastWriteTime
    //获取或设置上次写入当前文件或目录的时间

    LastWriteTimeUtc
    //获取或设置上次写入当前文件或目录的时间,其格式为协调世界时(UTC)

    Length
    //获取当前文件的大小(以字节为单位)

    Name
    //获取文件名

    Directory类

    CreateDirectory(string path[string])
    //创建目录,如果字符路径包含子目录名称,将一并创建
    //示例:
    string path = @"e:/Animal/Person/Employee/";
    DirectoryInfo dir = Directory.CreateDirectory(path);

    EnumerateDirectories(string path)
    //返回一个IEnumerable<string>集合,存储了每个目录的名称的字符表示,类似的有DirectoryInfo的EnumerateDirectories方法,返回一个IEnumerable<DirectoryInfo>集合,存储每个目录的实例
    //也可以使用GetDirectories,该方法返回string[],类似的有DirectoryInfo的GetDirectories,返回DirectoryInfo[]

    EnumerateFiles(string path,[string search])
    //返回一个IEnumerable<string>集合,存储了当前目录下的文件的名称的字符表示,类似的有DirectoryInfo的EnumerateFiles方法,返回一个IEnumerable<FileInfo>集合,存储每个文件的实例
    //也可以使用GetFiles,该方法返回string[],类似的有DirectoryInfo的GetFiles,返回FileInfo[]
    //示例:
    string path = @"e/";
    var txtFiles = Directory.EnumerateFiles(path, "*.txt");
    var fileNameStr = txtFiles.Where(fileName => fileName.Contains("a"));
    GetCurrentDirectory()
    //获取当前应用程序的工作目录

    GetDirectories(string path)
    //返回一个string[],存储了当前目录的子目录集合,类似的有DirectoryInfo的GetDirectories方法,返回一个DirectoryInfo[],存储了当前目录的每个子目录的实例

    GetDirectoryRoot(string path)
    //返回目录的卷信息和根信息

    GetParent(string path)
    //获取当前目录的父目录,返回一个DirectoryInfo实例表示父目录,类似的有DirectoryInfo的Parent属性

    SetCurrentDirectory(string path)
    //将当前应用程序的工作目录设置为参数指定的目录

    //此类还提供了操作文件的其它方法:
    //Delete(删除)、Exists(是否存在)、Move(移动)[等同于DirectoryInfo的MoveTo方法]
    //Get/SetCreationTime(设置或获取创建时间)、Get/SetLastAccessTime(最近一次访问目录的时间)、Get/SetLastWriteTime(最近一次写入数据到目录的时间)

    DirectoryInfo类

    除了具有Directory类的方法以外,它提供一系列的属性来表示目录的属性。

    Attributes
    //获取或设置当前文件或目录的特性。

    CreationTime
    //获取或设置当前文件或目录的创建时间。

    CreationTimeUtc
    //获取或设置当前文件或目录的创建时间,其格式为协调世界时(UTC)。

    Exists
    //获取指示目录是否存在的值。(覆盖 FileSystemInfo.Exists。)

    Extension
    //获取表示文件扩展名部分的字符串。

    FullName
    //获取目录的完整路径。(覆盖 FileSystemInfo.FullName。)

    LastAccessTime
    //获取或设置上次访问当前文件或目录的时间。

    LastAccessTimeUtc
    //获取或设置上次访问当前文件或目录的时间,其格式为协调世界时(UTC)。

    LastWriteTime
    //获取或设置上次写入当前文件或目录的时间。

    LastWriteTimeUtc
    //获取或设置上次写入当前文件或目录的时间,其格式为协调世界时(UTC)。

    Name
    //获取此 DirectoryInfo 实例的名称。(覆盖 FileSystemInfo.Name。)

    Parent
    //获取指定的子目录的父目录。

    Root
    //获取目录的根部分。

    参考文档

    盛世游侠文本文件和二进制文件的区别

     C# - 学习总目录

  • 相关阅读:
    [转] Immutable 常用API简介
    [转] 组件库按需加载 借助babel-plugin-import实现
    [转] react-router4 + webpack Code Splitting
    [转] React Hot Loader 3 beta 升级指南
    [转] 如何写好.babelrc?Babel的presets和plugins配置解析
    [转] webpack热更新配置小结
    [转] 学会fetch的用法
    [转] webpack3.0踩坑:postcss-loader的使用
    [转] 详解webpack-dev-server的使用
    webpack 使用环境变量
  • 原文地址:https://www.cnblogs.com/myrocknroll/p/8052405.html
Copyright © 2011-2022 走看看