C# 文件 I/O

  • 文件 I/O

    文件是存储在一个特定的名称和目录路径的磁盘数据的集合。打开文件进行读取或写入时,它成为流。流基本上是通过通信路径的字节序列。主要有两个流:输入流和输出流。该输入流用于从文件(读操作)读取数据和所述输出数据流是用于写入到该文件中(写操作)。
  • C# I/O 类

    System.IO命名空间具有各种类,这些类用于对文件执行大量操作,例如创建和删除文件,从文件读取或写入文件,关闭文件等。
    下表显示了System.IO命名空间中一些常用的非抽象类-
    I/O 类 说明
    BinaryReader 从二进制流中读取原始数据。
    BinaryWriter 以二进制格式写入原始数据。
    BufferedStream 字节流的临时存储。
    Directory 帮助操纵目录结构。
    DirectoryInfo 用于对目录执行操作。
    DriveInfo 提供驱动器的信息。
    File 帮助处理文件。
    FileInfo 用于对文件执行操作。
    FileStream 用于读取和写入文件中的任何位置。
    MemoryStream 用于随机访问存储在内存中的流数据。
    Path 对路径信息执行操作。
    StreamReader 用于读取字节流中的字符。
    StreamWriter 用于将字符写入流。
    StringReader 用于从字符串缓冲区读取。
    StringWriter 用于写入字符串缓冲区。
  • FileStream 类

    System.IO 命名空间中的FileStream类有助于读取,写入和关闭文件。该类派生自抽象类Stream。您需要创建一个FileStream对象来创建一个新文件或打开一个现有文件。创建FileStream对象的语法如下-
    
    FileStream <object_name> = new FileStream( <file_name>, <FileMode Enumerator>,<FileAccess Enumerator>, <FileShare Enumerator>);
    
    例如,我们创建一个FileStream对象F来读取名为sample.txt的文件,如下所示-
    
    FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
    
    参数 说明
    FileMode FileMode枚举器定义了各种打开文件的方法。 FileMode枚举器的成员是-
    • Append − 它会打开一个现有文件,并将光标放在文件末尾,或者如果文件不存在,则创建该文件。
    • Create − 它创建一个新文件。
    • CreateNew − 它向操作系统指定应创建一个新文件。
    • Open − 它将打开一个现有文件。
    • OpenOrCreate − 它向操作系统指定应打开一个文件(如果存在),否则应创建一个新文件。
    • Truncate − 它打开一个现有文件,并将其大小截断为零字节。
    FileAccess FileAccess枚举器具有成员:Read,ReadWrite和Write。
    FileShare FileShare枚举器具有以下成员−
    • Inheritable − 它允许文件句柄将继承传递给子进程
    • None − 拒绝共享当前文件
    • Read − 它允许打开文件以供读入。
    • ReadWrite − 它允许打开文件进行读写
    • Write − 它允许打开文件进行写入
    以下程序演示了FileStream类的用法-
    
    using System;
    using System.IO;
    
    namespace FileIOApplication {
       class Program {
          static void Main(string[] args) {
             FileStream F = new FileStream("test.dat", FileMode.OpenOrCreate, 
                FileAccess.ReadWrite);
             
             for (int i = 1; i <= 20; i++) {
                F.WriteByte((byte)i);
             }
             F.Position = 0;
             for (int i = 0; i <= 20; i++) {
                Console.Write(F.ReadByte() + " ");
             }
             F.Close();
             Console.ReadKey();
          }
       }
    }
    
  • C# 中的高级文件操作

    前面的示例提供了C# 中的简单文件操作。但是,要利用C# System.IO类的强大功能,您需要了解这些类的常用属性和方法。
    读取和写入文本文件
    它涉及读取和写入文本文件。该的StreamReader和StreamWriter的类可以帮助来完成它。
    StreamReader 方法
    • public override void Close() - 它关闭StreamReader对象和基础流,并释放与阅读器关联的所有系统资源。
    • public override int Peek() - 返回下一个可用字符,但不使用它。
    • public override int Read() - 从输入流中读取下一个字符,并将字符位置前移一个。
    treamWriter 方法
    • public override void Close() - 关闭当前的StreamWriter对象和基础流。
    • public override void Flush() - 清除当前写入器的所有缓冲区,并使所有缓冲的数据写入基础流。
    • public virtual void Write(bool value) - 将布尔值的文本表示形式写入文本字符串或流。 (继承自TextWriter。)
    • public override void Write(char value) - 将字符写入流。
    • public virtual void Write(decimal value) - 将十进制值的文本表示形式写入文本字符串或流。
    • public virtual void Write(double value) - 将8字节浮点值的文本表示形式写入文本字符串或流。
    • public virtual void Write(int value) - 将4字节有符号整数的文本表示形式写入文本字符串或流。
    • public override void Write(string value) - 将字符串写入流。
    • public virtual void WriteLine() - 将行终止符写入文本字符串或流。
    
    using System;
    using System.IO;
    
    namespace FileApplication {
       class Program {
          static void Main(string[] args) {
             try {
                // Create an instance of StreamReader to read from a file.
                // The using statement also closes the StreamReader.
                using (StreamReader sr = new StreamReader("c:/jamaica.txt")) {
                   string line;
    
                   // Read and display lines from the file until 
                   // the end of the file is reached. 
                   while ((line = sr.ReadLine()) != null) {
                      Console.WriteLine(line);
                   }
                }
             } catch (Exception e) {
                // Let the user know what went wrong.
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(e.Message);
             }
             Console.ReadKey();
          }
       }
    }
    
    
    using System;
    using System.IO;
    
    namespace FileApplication {
       class Program {
          static void Main(string[] args) {
             string[] names = new string[] {"Zara Ali", "Nuha Ali"};
             
             using (StreamWriter sw = new StreamWriter("names.txt")) {
    
                foreach (string s in names) {
                   sw.WriteLine(s);
                }
             }
             
             // Read and show each line from the file.
             string line = "";
             using (StreamReader sr = new StreamReader("names.txt")) {
                while ((line = sr.ReadLine()) != null) {
                   Console.WriteLine(line);
                }
             }
             Console.ReadKey();
          }
       }
    }
    
    读取和写入二进制文件 - 它涉及读取和写入二进制文件。该BinaryReader在和的BinaryWriter类可以帮助实现这一目标。
    BinaryReader 类方法
    • public override void Close() 它关闭BinaryReader对象和基础流。
    • public virtual int Read() 从基础流中读取字符并前进流的当前位置。
    • public virtual bool ReadBoolean() 从当前流中读取布尔值,并将流的当前位置前移一个字节。
    • public virtual byte ReadByte() 从当前流中读取下一个字节,并将流的当前位置前移一个字节。
    • public virtual byte[] ReadBytes(int count) 从当前流中将指定数量的字节读取到字节数组中,并将当前位置前移该字节数量。
    • public virtual char ReadChar() 从当前流中读取下一个字符,并根据所使用的编码和从流中读取的特定字符来推进流的当前位置。
    • public virtual char[] ReadChars(int count) 从当前流中读取指定数量的字符,返回字符数组中的数据,并根据使用的编码和从流中读取的特定字符来推进当前位置。
    • public virtual double ReadDouble() 从当前流中读取一个8字节的浮点值,并将该流的当前位置前移8个字节。
    • public virtual int ReadInt32() 从当前流中读取一个4字节有符号整数,并将该流的当前位置前移四个字节。
    • public virtual string ReadString() 从当前流中读取一个字符串。该字符串以长度为前缀,一次编码为7位整数。
    BinaryWriter 类方法
    • public override void Close() - 它关闭BinaryWriter对象和基础流。
    • public virtual void Flush() - 清除当前写入器的所有缓冲区,并使所有缓冲的数据写入底层设备。
    • public virtual long Seek(int offset, SeekOrigin origin) - 设置当前流中的位置。
    • public virtual void Write(bool value) - 将一字节的布尔值写入当前流,其中0表示false,1表示true。
    • public virtual void Write(byte value) - 将无符号字节写入当前流,并将流位置前进一个字节。
    • public virtual void Write(byte[] buffer) - 将字节数组写入基础流。
    • public virtual void Write(char ch) - 根据使用的编码和写入到流中的特定字符,将Unicode字符写入当前流,并提高流的当前位置。
    • public virtual void Write(char[] chars) - 根据使用的编码和写入到流中的特定字符,将字符数组写入当前流,并前进流的当前位置。
    • public virtual void Write(double value) - 将一个八字节的浮点值写入当前流,并将流位置前进八个字节。
    • public virtual void Write(int value) - 将四个字节的有符号整数写入当前流,并将流位置前移四个字节。
    • public virtual void Write(string value) - 以BinaryWriter的当前编码方式向该流中写入一个带前缀的字符串,并根据所使用的编码和要写入该流中的特定字符来推进流的当前位置。
    
    using System;
    using System.IO;
    
    namespace BinaryFileApplication {
       class Program {
          static void Main(string[] args) {
             BinaryWriter bw;
             BinaryReader br;
             
             int i = 25;
             double d = 3.14157;
             bool b = true;
             string s = "I am happy";
             
             //create the file
             try {
                bw = new BinaryWriter(new FileStream("mydata", FileMode.Create));
             } catch (IOException e) {
                Console.WriteLine(e.Message + "\n Cannot create file.");
                return;
             }
             
             //writing into the file
             try {
                bw.Write(i);
                bw.Write(d);
                bw.Write(b);
                bw.Write(s);
             } catch (IOException e) {
                Console.WriteLine(e.Message + "\n Cannot write to file.");
                return;
             }
             bw.Close();
             
             //reading from the file
             try {
                br = new BinaryReader(new FileStream("mydata", FileMode.Open));
             } catch (IOException e) {
                Console.WriteLine(e.Message + "\n Cannot open file.");
                return;
             }
             
             try {
                i = br.ReadInt32();
                Console.WriteLine("Integer data: {0}", i);
                d = br.ReadDouble();
                Console.WriteLine("Double data: {0}", d);
                b = br.ReadBoolean();
                Console.WriteLine("Boolean data: {0}", b);
                s = br.ReadString();
                Console.WriteLine("String data: {0}", s);
             } catch (IOException e) {
                Console.WriteLine(e.Message + "\n Cannot read from file.");
                return;
             }
             br.Close();
             Console.ReadKey();
          }
       }
    }
    
    操纵Windows文件系统 - 它使C# 程序员能够浏览和定位Windows文件和目录。
    
    using System;
    using System.IO;
    
    namespace WindowsFileApplication {
       class Program {
          static void Main(string[] args) {
             //creating a DirectoryInfo object
             DirectoryInfo mydir = new DirectoryInfo(@"c:\Windows");
             
             // getting the files in the directory, their names and size
             FileInfo [] f = mydir.GetFiles();
             foreach (FileInfo file in f) {
                Console.WriteLine("File Name: {0} Size: {1}", file.Name, file.Length);
             }
             
             Console.ReadKey();
          }
       }
    }