C#编程基础四

操作Windows文件系统

文件是存储在具有特定名称和目录路径的磁盘中的数据的集合。当文件打开以进行读取或写入时,它将成为流。

流基本上是通过通信路径的字节序列。有两个主要流:输入流和输出流。输入流用于从文件读取数据(读取操作),输出流用于写入文件(写入操作)。

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枚举器有成员:ReadReadWriteWrite
  • 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();
	  }
   }
}

当上述代码被编译并执行时,它产生以下结果:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -1

C# 中的高级文件操作

前面的例子提供了 C# 中的简单文件操作。要利用 C# 中的System.IO类的强大功能,需要知道这些类常用的属性和方法。

System.IO类中一此最常用的方法和示例如下所列 -

  • 读取和写入文本文件 - 它涉及到阅读和写入文本文件。StreamReaderStreamWriter类有助于完成它。
  • 读取和写入二进制文件 - 它涉及从二进制文件读取和写入。BinaryReaderBinaryWriter类有助于完成此操作。
  • 操作Windows文件系统 - 它为 C# 程序员提供浏览和查找Windows文件和目录的能力。

读取和写入文本文件

StreamReader和StreamWriter类用于从文本文件读取和写入数据。这些类继承自抽象基类Stream,它支持读取和写入文件流中的字节。

StreamReader类

StreamReader类是从抽象基类TextReader继承,它也是一个读取系列字符的读取器。 下表介绍了StreamReader类的一些常用方法:

序号 方法 描述
1 public override void Close() 它关闭StreamReader对象和底层流,并释放与读取器相关联的任何系统资源。
2 public override int Peek() 返回下一个可用字符,但不消耗它。
3 public override int Read() 从输入流读取下一个字符,并将字符位置提前一个。

示例

以下示例演示如何C#程序读取一个名称为Jamaica.txt的文本文件,该文件内容如下所示:

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

在编译和运行程序时,猜一下它显示的内容 -



StreamWriter类

StreamWriter类继承自抽象类TextWriter表示一个写入器,可以编入序列字符。

下表描述了此类最常用的方法:

序号 方法 描述
1 public override void Close() 关闭当前StreamWriter对象和底层流。
2 public override void Flush() 清除当前写入程序的所有缓冲区,并将任何缓冲的数据写入底层流。
3 public virtual void Write(bool value) 将布尔值的文本表示写入文本字符串或流(从TextWriter继承)
4 public override void Write(char value) 将字符写入流
5 public virtual void Write(decimal value) 将十进制值的文本表示形式写入文本字符串或流。
6 public virtual void Write(double value) 8字节浮点值的文本表示写入文本字符串或流。
7 public virtual void Write(int value) 4字节有符号整数的文本表示写入文本字符串或流。
8 public override void Write(string value) 将一个字符串写入流。
9 public virtual void WriteLine() 将行终止符写入文本字符串或流。

有关方法的完整列表,请访问Microsoft的 C# 文档。

示例

以下示例演示使用StreamWriter类将文本数据写入文件:

using System;
using System.IO;

namespace FileApplication
{
   class Program
   {
	  static void Main(string[] args)
	  {
		 string[] names = new string[] {"Max Su", "Sukida"};
		 using (StreamWriter sw = new StreamWriter("all_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("all_names.txt"))
		 {
			while ((line = sr.ReadLine()) != null)
			{
			   Console.WriteLine(line);
			}
		 }
		 Console.ReadKey();
	  }
   }
}

当上述代码被编译并执行时,它产生以下结果:

Max Su
Sukida

读取和写入二进制文件

BinaryReader和BinaryWriter类用于读取和写入二进制文件。

BinaryReader类

BinaryReader类用于从文件读取二进制数据。通过将FileStream对象传递给其构造函数来创建BinaryReader对象。

下表介绍了BinaryReader类的常用方法。

BinaryWriter类

BinaryWriter类用于将二进制数据写入流。通过将FileStream对象传递给其构造函数来创建BinaryWriter对象。

下表介绍了BinaryWriter类的常用方法。

序号 方法 描述
1 public override void Close() 它关闭BinaryWriter对象和底层流。
2 public virtual void Flush() 清除当前写入器的所有缓冲区,并将任何缓冲数据写入底层设备。
3 public virtual long Seek(int offset, SeekOrigin origin) 设置当前流中的位置。
4 public virtual void Write(bool value) 将一个字节的布尔值写入当前流,其中0表示false1表示true
5 public virtual void Write(byte value) 将无符号字节写入当前流,并将流位置提前一个字节。
6 public virtual void Write(byte[] buffer) 将一个字节数组写入底层流。
7 public virtual void Write(char ch) 将Unicode字符写入当前流,并根据所使用的编码并将特定字符写入流的当前位置。
8 public virtual void Write(char[] chars) 将字符阵列写入当前流,并根据所使用的编码和特定字符写入流的当前位置。
9 public virtual void Write(double value) 8字节的浮点值写入当前流,将流位置提前8位。
10 public virtual void Write(int value) 将一个4字节有符号整数写入当前流,并将流位置提前4个字节。
11 public virtual void Write(string value) BinaryWriter的当前编码中将长度为前缀的字符串写入此流,并根据所使用的编码和将特定字符写入流来提前流的当前位置。

有关方法的完整列表,请访问Microsoft C# 文档。

示例

以下示例演示读取和写入二进制数据:

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

当上述代码被编译并执行时,它产生以下结果:

Integer data: 25
Double data: 3.14157
Boolean data: True
String data: I am happy

操作Windows文件系统

C# 中可使用各种目录和文件相关类(如:DirectoryInfo类和FileInfo类)来处理目录和文件。

DirectoryInfo类

DirectoryInfo类派生自FileSystemInfo类。它具有创建,移动和浏览目录和子目录的各种方法,这个类不能被继承。

以下是DirectoryInfo类的一些常用属性:

序号 属性 描述
1 Attributes 获取当前文件或目录的属性
2 CreationTime 获取当前文件或目录的创建时间
3 Exists 获取一个布尔值,指示目录是否存在
4 Extension 获取表示文件扩展名的字符串
5 FullName 获取目录或文件的完整路径
6 LastAccessTime 获取上次访问当前文件或目录的时间
7 Name 获取此DirectoryInfo实例的名称

以下是DirectoryInfo类的一些常用方法:

序号 方法 描述
1 public void Create() 创建一个目录
2 public DirectoryInfo CreateSubdirectory(string path) 在指定的路径上创建一个子目录或子目录。指定的路径可以相对于DirectoryInfo类的此实例。
3 public override void Delete() 如果DirectoryInfo为空,则将其删除。
4 public DirectoryInfo[] GetDirectories() 返回当前目录的子目录
5 public FileInfo[] GetFiles() 从当前目录返回文件列表

有关属性和方法的完整列表,请访问Microsoft的 C# 文档。

FileInfo类

FileInfo类派生自FileSystemInfo类。它具有用于创建,复制,删除,移动和打开文件的属性和实例方法,并有助于创建FileStream对象。这个类不能被继承。

以下是FileInfo类的一些常用属性:

序号 属性 描述
1 Attributes 获取当前文件的属性
2 CreationTime 获取当前文件的创建时间
3 Directory 获取文件所属目录的实例
4 Exists 获取一个布尔值,指示文件是否存在
5 Extension 获取表示文件扩展名的字符串
6 FullName 获取表示文件扩展名的字符串
7 LastAccessTime 获取当前文件上次访问的时间
8 LastWriteTime 获取文件的最后一次写入的时间
9 Length 获取当前文件的大小(以字节为单位)
10 Name 获取文件的名称

以下是FileInfo类的一些常用方法:

序号 方法 描述
1 public StreamWriter AppendText() 创建一个StreamWriter,将文本附加到FileInfo的此实例所表示的文件中。
2 public FileStream Create() 创建一个文件
3 public override void Delete() 永久删除文件
4 public void MoveTo(string destFileName) 将指定的文件移动到新位置,提供指定新文件名的选项。
5 public FileStream Open(FileMode mode) 以指定的模式打开文件
6 public FileStream Open(FileMode mode, FileAccess access) 以指定的模式打开文件,读取,写入或读/写访问。
7 public FileStream Open(FileMode mode, FileAccess access, FileShare share) 以指定的模式打开一个文件,具有读,写或读/写访问权限以及指定的共享选项。
8 public FileStream OpenRead() 创建只读FileStream对象
9 public FileStream OpenWrite() 创建一个只写FileStream对象

有关属性和方法的完整列表,请访问Microsoft的 C# 文档。

例子

以下示例演示如何使用上述类:

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

编译并运行程序时,会在Windows目录中显示文件的名称及其各自的大小。

File Name: 3IoaQ3K3QY24H34.lAxO5 Size: 273424
File Name: 4mA6y1wAaD9.7t6uh Size: 188432
File Name: 55PLR.kc2Ik Size: 149520
File Name: 76.axv4b Size: 159760
File Name: 7V.8f9bG Size: 182288
File Name: 87.IX8Gn Size: 149520
File Name: 8ppwDb11OX.kPI6E Size: 235536
File Name: 912uo49t7bJm864.W39C1 Size: 296976
File Name: Bcdedit.dll Size: 294912
File Name: bfsvc.exe Size: 61952
File Name: bootstat.dat Size: 67584
File Name: D8Ecap.exe Size: 593920
File Name: diagerr.xml Size: 25689
File Name: diagwrn.xml Size: 24768
File Name: difxapi.dll Size: 440816
File Name: explorer.exe Size: 4516800
File Name: f3C.xP3I3 Size: 95248
File Name: HelpPane.exe Size: 995840
File Name: hh.exe Size: 18432
File Name: iGF1xcHJ.6mb1C Size: 299024
File Name: Irremote.ini Size: 90
File Name: KwYlx.dat Size: 21
File Name: LisW.fZ5j7 Size: 191504
File Name: mib.bin Size: 43131
File Name: msdfmap.ini Size: 1405
File Name: msvcp100.dll Size: 607568
File Name: msvcr100.dll Size: 827728
File Name: notepad.exe Size: 244736
File Name: ODBCINST.INI Size: 469
File Name: P.Wj9s5 Size: 125968
File Name: PFRO.log Size: 91720
File Name: Professional.xml Size: 32200
File Name: progress.ini Size: 36
File Name: PWMBTHLV.EXE Size: 527424
File Name: Px81C.5MH78 Size: 8208
File Name: py.exe Size: 889496
File Name: pyshellext.amd64.dll Size: 55456
File Name: pyw.exe Size: 890008
File Name: regedit.exe Size: 320512
File Name: Rg6TkqTadeve.R3tFV Size: 200720
File Name: RH8B2V4.4mJpC Size: 128016
File Name: Rt.B95F5 Size: 190480
File Name: RZ7Zz6.uq8Cy Size: 145424
File Name: SMSS-PFRO2049.tmp Size: 33472
File Name: splwow64.exe Size: 128000
File Name: system.ini Size: 219
File Name: taujpXUAfKl6Bm4.9yyCF Size: 131088
File Name: twain_32.dll Size: 60416
File Name: U.W49u1 Size: 153616
File Name: UwAJaF4C9fZjL.tiD4d Size: 52240
File Name: W8kk3rCc3HQSb3r.mXlkk Size: 100368
File Name: win.ini Size: 452
File Name: WindowsShell.Manifest Size: 670
File Name: WindowsUpdate.log Size: 275
File Name: winhlp32.exe Size: 10240
File Name: WMSysPr9.prx Size: 316640
File Name: write.exe Size: 11264
File Name: WVS_InstDBLogFile.csv Size: 727
File Name: WzB.3Z9CP Size: 76816
File Name: XuuYSy1s.3drra Size: 34832
File Name: YQ2dO3.7T7OO Size: 299024

FileStream类

C#FileStream类为文件操作提供了一个流。它可以用于执行同步和异步的读写操作。在FileStream类的帮助下,我们可以轻松地将数据读写到文件中。

C# FileStream示例:将单字节写入文件

下面来看看一个使用FileStream类的简单例子,它实现将单字节的数据写入文件。在这里,使用OpenOrCreate文件模式打开文件,这样的话可以对文件执行读写操作。

using System;  
using System.IO;  
public class FileStreamExample  
{  
	public static void Main(string[] args)  
	{  
		FileStream f = new FileStream("e:\\filestream-demo.txt", FileMode.OpenOrCreate);//creating file stream  
		f.WriteByte(65);//writing byte into stream  
		f.Close();//closing stream  
	}  
}

执行上面代码后,打文件:filestream-demo.txt应该会看到以下内容 -

A

C# FileStream示例:将多个字节写入文件

下面再来看看另外一个例子,使用循环将多个字节的数据写入文件。

using System;  
using System.IO;  
public class FileStreamExample  
{  
	public static void Main(string[] args)  
	{  
		FileStream f = new FileStream("e:\\filestream-demo.txt", FileMode.OpenOrCreate);  
		for (int i = 65; i <= 90; i++)  
		{  
			f.WriteByte((byte)i);  
		}  
		f.Close();  
	}  
}

执行上面代码后,打文件:filestream-demo.txt应该会看到以下内容 -

ABCDEFGHIJKLMNOPQRSTUVWXYZ

C# FileStream示例:从文件中读取所有字节

下面来看看一个使用FileStream类从文件中读取数据的例子。 这里,FileStream类的ReadByte()方法返回单字节。要读取所有的字节,需要使用循环。

using System;  
using System.IO;  
public class FileStreamExample  
{  
	public static void Main(string[] args)  
	{  
		FileStream f = new FileStream("e:\\filestream-demo.txt", FileMode.OpenOrCreate);  
		int i = 0;  
		while ((i = f.ReadByte()) != -1)  
		{  
			Console.Write((char)i);  
		}  
		f.Close();  
	}  
}

执行上面代码后,应该会看到输出以下内容 -

ABCDEFGHIJKLMNOPQRSTUVWXYZ

StreamReader类

C#StreamReader类用于从流中读取字符串。它继承自TextReader类,它提供Read()和ReadLine()方法从流中读取数据。

C# StreamReader示例:读取一行

下面来看看一个StreamReader类的简单例子,它从文件中读取一行数据。

using System;
using System.IO;
public class StreamReaderExample
{
	public static void Main(string[] args)
	{
		FileStream f = new FileStream("e:\\myoutput.txt", FileMode.OpenOrCreate);
		StreamReader s = new StreamReader(f);

		string line = s.ReadLine();
		Console.WriteLine(line);
		string line2 = s.ReadLine();
		Console.WriteLine(line2);
		s.Close();
		f.Close();
	}
}

假设e:\myoutput.txt文件的内容如下 -

This is line 1
This is line 2
This is line 3
This is line 4

执行上面示例代码,得到以下输出结果 -

This is line 1
This is line 2

C# StreamReader示例:读取所有行

下面代码演示如何使用StreamReader来读取文件:myoutput.txt中的所有行内容 -

using System;
using System.IO;
public class StreamReaderExample
{
	public static void Main(string[] args)
	{
		FileStream f = new FileStream("e:\\myoutput.txt", FileMode.OpenOrCreate);
		StreamReader s = new StreamReader(f);

		string line = "";
		while ((line = s.ReadLine()) != null)
		{
			Console.WriteLine(line);
		}
		s.Close();
		f.Close();
	}
}

执行上面示例代码,得到以下输出结果 -

This is line 1
This is line 2
This is line 3
This is line 4

TextWriter类

C#TextWriter类是一个抽象类。它用于将文本或连续的字符串写入文件。它在System.IO命名空间中定义。

C#TextWriter示例

让我们来看看TextWriter类的简单例子,演示如何使用它来写入两行数据。

using System;
using System.IO;
namespace TextWriterExample
{
	class Program
	{
		static void Main(string[] args)
		{
			using (TextWriter writer = File.CreateText("e:\\TextWriter.txt"))
			{
				writer.WriteLine("Hello C#, TextWriter");
				writer.WriteLine("C# File Handling by Yiibai.com");
			}
			Console.WriteLine("Data written successfully...");
		}
	}
}

执行上面示例代码后,打开TextWriter.txt得到以下结果 -

Hello C#, TextWriter
C# File Handling by Yiibai.com

TextReader类

C#TextReader类在System.IO命名空间中定义。它表示一个可以用来读取文本或连续字符串的读取器。

C# TextReader示例:读取文件中所有数据

下面让我们来看看,TextReader类的一个简单示例,使用它来从指定文件中读取数据直到文件结尾。

假设有一个名称为:TextWriter.txt的文件,内容如下 -

Hello C#, TextWriter
C# File Handling by Yiibai.com

示例代码如下 -

using System;
using System.IO;
namespace TextReaderExample
{
	class Program
	{
		static void Main(string[] args)
		{
			using (TextReader tr = File.OpenText("e:\\TextWriter.txt"))
			{
				Console.WriteLine(tr.ReadToEnd());
			}
		}
	}
}

执行上面示例代码,得到以下输出结果 -

Hello C#, TextWriter
C# File Handling by Yiibai.com

C# TextReader示例:读一行

下面来看看如何使用TextReader类从文件中读取一行的一个简单例子。

假设用有一个文本文件:TextWriter.txt,有以下内容 -

Hello C#, TextWriter
C# File Handling by Yiibai.com

示例代码 -

using System;
using System.IO;
namespace TextReaderExample
{
	class Program
	{
		static void Main(string[] args)
		{
			using (TextReader tr = File.OpenText("e:\\TextWriter.txt"))
			{
				Console.WriteLine(tr.ReadLine());
			}
		}
	}
}

执行上面程序代码,得到以下结果 -

Hello C#, TextWriter

BinaryWriter类

C#BinaryWriter类用于将二进制信息写入流中。它在System.IO命名空间中找到。它还支持以特定编码编写字符串。

C# BinaryWriter示例

我们来看看将数据写入数据文件的BinaryWriter类的简单例子。

using System;  
using System.IO;  
namespace BinaryWriterExample  
{  
	class Program  
	{  
		static void Main(string[] args)  
		{  
			string fileName = "e:\\binaryfile.dat";  
			using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))  
			{  
				writer.Write(1024);  
				writer.Write("this is string data");  
				writer.Write(true);  
			}  
			Console.WriteLine("Data written successfully...");    
		}  
	}  
}

执行上面示例代码,得到以下结果 -

Data written successfully...

BinaryReader类

C#BinaryReader类用于从流中读取二进制信息。它在System.IO命名空间中定义。它还支持在特定编码中读取字符串。

C# BinaryReader示例

我们来看看使用BinaryReader类从dat类型文件读取数据的简单例子。

using System;
using System.IO;
namespace BinaryWriterExample
{
	class Program
	{
		static void Main(string[] args)
		{
			WriteBinaryFile();
			ReadBinaryFile();
			Console.ReadKey();
		}
		static void WriteBinaryFile()
		{
			using (BinaryWriter writer = new BinaryWriter(File.Open("e:\\binaryfile.dat", FileMode.Create)))
			{

				writer.Write(250);
				writer.Write("this is string data");
				writer.Write(true);
			}
		}
		static void ReadBinaryFile()
		{
			using (BinaryReader reader = new BinaryReader(File.Open("e:\\binaryfile.dat", FileMode.Open)))
			{
				Console.WriteLine("Double Value : " + reader.ReadDouble());
				Console.WriteLine("String Value : " + reader.ReadString());
				Console.WriteLine("Boolean Value : " + reader.ReadBoolean());
			}
		}
	}
}

执行上面示例代码,得到以下结果 -

Double Value : 250
String Value : this is string data
Boolean Value : true

StringWriter类

这个类用于写入和处理字符串数据而不是文件。它是派生自TextWriter类。StringWriter类写入的字符串数据存储到StringBuilder中。

StringWriter类的目的是将操作字符串的结果保存到StringBuilder中。

StringWriter类签名

[SerializableAttribute]  
[ComVisibleAttribute(true)]  
public class StringWriter : TextWriter

C#StringWriter构造函数

构造函数 描述
StringWriter() 它用于初始化StringWriter类的新实例。
StringWriter(IFormatProvider) 它用于使用指定的格式控件初始化StringWriter类的新实例。
StringWriter(StringBuilder) 它用于初始化写入指定StringBuilderStringWriter类的新实例。
StringWriter(StringBuilder,?IFormatProvider) 它用于初始化写入指定的StringBuilderStringWriter类的新实例,并具有指定的格式提供程序。

C# StringWriter属性

属性 描述
Encoding 它用于获取写入输出的编码。
FormatProvider 它用于获取控制格式化的对象。
NewLine 它用于获取或设置当前TextWriter使用的行终止符字符串。

C# StringWriter方法

属性 描述
Close() 它用于关闭当前的StringWriter和底层流。
Dispose() 它用于释放TextWriter对象使用的所有资源。
Equals(Object) 它用于确定指定的对象是否等于当前对象。
Finalize() 它允许对象尝试释放资源并执行其他清理操作。
GetHashCode() 它用作默认散列函数。
GetStringBuilder() 它返回底层的StringBuilder
ToString() 它返回一个包含写入当前StringWriter的字符串。
WriteAsync(String) 它用于将异步字符串写入字符串。
Write(Boolean) 它用于将布尔值的文本表示写入字符串。
Write(String) 它用于将字符串写入当前字符串。
WriteLine(String) 它用于将字符串后跟一个行终止符写入字符串或流。
WriteLineAsync(String) 写一个字符串后跟一个行终止符与当前字符串异步(覆盖TextWriter.WriteLineAsync(String)方法。)

C# StringWriter示例

在下面的程序中,使用StringWriter类将字符串信息写入StringBuilder类。StringReader类用于读取写入信息到StringBuilder类中。

using System;
using System.IO;
using System.Text;
namespace CSharpProgram
{
	class Program
	{
		static void Main(string[] args)
		{
			string text = "Hello, Welcome to the yiibai.com \n" +
				"It is nice site. \n" +
				"It provides IT tutorials";
			// Creating StringBuilder instance  
			StringBuilder sb = new StringBuilder();
			// Passing StringBuilder instance into StringWriter  
			StringWriter writer = new StringWriter(sb);
			// Writing data using StringWriter  
			writer.WriteLine(text);
			writer.Flush();
			// Closing writer connection  
			writer.Close();
			// Creating StringReader instance and passing StringBuilder  
			StringReader reader = new StringReader(sb.ToString());
			// Reading data  
			while (reader.Peek() > -1)
			{
				Console.WriteLine(reader.ReadLine());
			}
		}
	}
}

执行上面示例代码,得到以下结果 -

Hello, Welcome to the yiibai.com
It is nice site.
It provides IT tutorials

StringReader类

StringReader类用于读取StringWriter类写入的数据。它是TextReader类的子类。它使我们能够同步或异步读取字符串。它提供了执行读操作的构造函数和方法。

C# StringReader签名

[SerializableAttribute]  
[ComVisibleAttribute(true)]  
public class StringReader : TextReader

C# StringReader构造函数

StringReader具有以下构造函数。

构造函数 描述
StringReader(String) 从指定字符串读取初始化StringReader类的新实例。

C# StringReader方法

以下是StringReader类的方法。

方法 描述
Close() 它用于关闭StringReader
Dispose() 它用于释放TextReader对象使用的所有资源。
Equals(Object) 它确定指定的对象是否等于当前对象。
Finalize() 它允许对象尝试释放资源并执行其他清理操作。
GetHashCode() 它作为默认散列函数。
GetType() 它用于获取当前实例的类型。
Peek() 它用于返回下一个可用的字符,但不消耗它。
Read() 它用于从输入字符串中读取下一个字符。
ReadLine() 它用于从当前字符串中读取一行字符。
ReadLineAsync() 它用于从当前字符串异步读取一行字符。
ReadToEnd() 它用于读取从当前位置到字符串末尾的所有字符。
ReadToEndAsync() 用于从当前位置到字符串末尾异步读取所有字符。
ToString() 它用于返回表示当前对象的字符串。

C# StringReader示例

在以下示例中,StringWriter类用于写入字符串信息,StringReader类用于读取由StringWriter类编写的字符串。

using System;  
using System.IO;  
namespace CSharpProgram  
{  
	class Program  
	{  
		static void Main(string[] args)  
		{  
			StringWriter str = new StringWriter();  
			str.WriteLine("Hello, this message is read by StringReader class");  
			str.Close();  
			// Creating StringReader instance and passing StringWriter  
			StringReader reader = new StringReader(str.ToString());  
			// Reading data  
			while (reader.Peek() > -1)  
			{  
				Console.WriteLine(reader.ReadLine());  
			}  
		}  
	}  
}

执行上面示例代码,得到以下结果 -

Hello, this message is read by StringReader class

FileInfo类

C# 中的FileInfo类用于处理及操作文件。它提供用于创建,删除和读取文件的属性和方法。 它使用StreamWriter类将文件写入文件。它在System.IO命名空间中定义。

C# FileInfo类声明

[SerializableAttribute]  
[ComVisibleAttribute(true)]  
public sealed class FileInfo : FileSystemInfo

C# FileInfo构造函数

下表列出FileInfo类的构造函数。

构造函数 描述
FileInfo(String) 它用于初始化FileInfo类的新实例,该实例充当文件路径的包装器。

C# FileInfo属性

下表列出FileInfo类的属性。

属性 描述
Attributes 它用于获取或设置当前文件或目录的属性。
CreationTime 它用于获取或设置当前文件或目录的创建时间。
Directory 它用于获取父目录的实例。
DirectoryName 它用于获取表示目录完整路径的字符串。
Exists 它用于获取一个值,指示文件是否存在。
FullName 它用于获取目录或文件的完整路径。
IsReadOnly 它用于获取或设置确定当前文件是否为只读的值。
LastAccessTime 它用于获取或设置从上一次访问当前文件或目录的时间。
Length 它用于获取当前文件的字节数。
Name 它用于获取文件的名称。

C# FileInfo方法

下表列出FileInfo类中定义的方法。

方法 描述
AppendText() 它用于创建一个StreamWriter类对象,将文本附加到FileInfo的此实例所表示的文件中。
CopyTo(String) 它用于将现有文件复制到新文件。
Create() 它用于创建文件。
CreateText() 它用于创建一个写入新文本文件的StreamWriter类对象。
Decrypt() 它用于解密由使用加密方法当前帐户加密的文件。
Delete() 它用于永久删除文件。
Encrypt() 它用于加密文件,以便只有用于加密文件的帐户才能对其进行解密。
GetAccessControl() 它用于获取封装访问控制列表(ACL)条目的FileSecurity对象。
MoveTo(String) 它用于将特定文件移动到新的指定位置。
Open(FileMode) 它用于以指定的模式来打开文件。
OpenRead() 它用于创建只读FileStream
OpenText() 它用于创建从现有文本文件使用UTF8编码读取的StreamReader类。
OpenWrite() 它用于创建只写FileStream对象。
Refresh() 它用于刷新对象的状态。
Replace(String,String) 用于使用当前FileInfo对象描述的文件替换指定文件的内容。
ToString() 它用于将路径作为字符串返回。

C# FileInfo示例:创建文件

using System;
using System.IO;
namespace CSharpProgram
{
	class Program
	{
		static void Main(string[] args)
		{
			try
			{
				// Specifying file location  
				string loc = "F:\\worksp\\csharp\\fileinfo.txt";
				// Creating FileInfo instance  
				FileInfo file = new FileInfo(loc);
				// Creating an empty file  
				file.Create();
				Console.WriteLine("File is created Successfuly");
			}
			catch (IOException e)
			{
				Console.WriteLine("Something went wrong: " + e);
			}
		}
	}
}

执行上面示例代码,得到以下结果 -

File is created Successfuly

可以在F:\worksp\csharp目录内看到有一个文件:fileinfo.txt被创建。如下图中所示 -

C# FileInfo示例:写入文件

using System;
using System.IO;
namespace CSharpProgram
{
	class Program
	{
		static void Main(string[] args)
		{
			try
			{
				// Specifying file location  
				string loc = "F:\\worksp\\csharp\\fileinfo.txt";
				// Creating FileInfo instance  
				FileInfo file = new FileInfo(loc);
				// Creating an file instance to write  
				StreamWriter sw = file.CreateText();
				// Writing to the file  
				sw.WriteLine("This text is written to the file by using StreamWriter class.");
				sw.Close();
			}
			catch (IOException e)
			{
				Console.WriteLine("Something went wrong: " + e);
			}
		}
	}
}

执行上面示例代码后,打开F:\worksp\csharp\fileinfo.txt文件,应该会看到以下内容 -

This text is written to the file by using StreamWriter class.

C# FileInfo示例:从文件中读取文本内容

using System;
using System.IO;
namespace CSharpProgram
{
	class Program
	{
		static void Main(string[] args)
		{
			try
			{
				// Specifying file to read  
				string loc = "F:\\worksp\\csharp\\fileinfo.txt";
				// Creating FileInfo instance  
				FileInfo file = new FileInfo(loc);
				// Opening file to read  
				StreamReader sr = file.OpenText();
				string data = "";
				while ((data = sr.ReadLine()) != null)
				{
					Console.WriteLine(data);
				}
			}
			catch (IOException e)
			{
				Console.WriteLine("Something went wrong: " + e);
			}
		}
	}
}

执行上面示例代码后,应该会看到以下结果 -

This text is written to the file by using StreamWriter class.

DirectoryInfo类

DirectoryInfo类是System.IO命名空间的一部分。它用于创建,删除和移动目录。它提供了执行与目录和子目录相关的操作的方法。这是一个密封的类,所以不能继承它。

DirectoryInfo类提供了下面列出的构造函数,方法和属性。

C# DirectoryInfo语法

[SerializableAttribute]  
[ComVisibleAttribute(true)]  
public sealed class DirectoryInfo : FileSystemInfo

C# DirectoryInfo构造函数

下表列出了DirectoryInfo类的构造函数。

构造函数 描述
DirectoryInfo(String) 它用于在指定的路径上初始化DirectoryInfo类的新实例。

C# DirectoryInfo属性

下表中列出了DirectoryInfo类的属性。

属性 描述
Attributes 它用于获取或设置当前文件或目录的属性。
CreationTime 它用于获取或设置当前文件或目录的创建时间。
CreationTimeUtc 它用于在协调的世界时间(UTC)中获取或设置创建时间。
Exists 它用于获取一个值,指示目录是否存在。
Extension 它用于获取表示文件扩展部分的字符串。
FullName 它用于获取目录的完整路径。
LastAccessTime 它用于获取或设置上次访问当前文件或目录的时间。
LastAccessTimeUtc 用于在当前文件或目录被上次访问的协调世界时间(UTC)中获取或设置时间。
LastWriteTime 它用于获取或设置当前文件或目录最后写入的时间。
LastWriteTimeUtc 当最后一次写入当前文件或目录时,它用于在协调世界时(UTC)中获取或设置时间。
Name 它用于获取此DirectoryInfo实例的名称。
Parent 它用于获取指定子目录的父目录。
Root 它用于获取目录的根部分。

C# DirectoryInfo方法

下表列出了DirectoryInfo类中定义的方法。

方法 描述
Create() 它用于创建一个目录。
Create(DirectorySecurity) 它用于使用DirectorySecurity对象创建目录。
CreateObjRef(Type) 它用于创建一个对象,其中包含生成用于与远程对象通信的代理所需的所有相关信息。
CreateSubdirectory(String) 它用于在指定的路径上创建一个子目录或子目录。
CreateSubdirectory(String,DirectorySecurity) 它用于在具有指定安全性的指定路径上创建子目录或子目录。
Delete() 如果DirectoryInfo为空,则用于删除DirectoryInfo
Delete(Boolean) 它用于删除DirectoryInfo的实例,指定是否删除子目录和文件。
EnumerateDirectories() 它返回当前目录中可用的目录信息集合。
EnumerateFiles() 它在当前目录中返回无数的文件信息集合。
GetAccessControl() 它用于获取一个DirectorySecurity对象,该对象封装了目录的访问控制列表(ACL)条目。
GetDirectories() 它返回当前目录的子目录。
GetFiles() 它从当前目录返回文件列表。
GetType() 它用于获取当前实例的类型。
MoveTo(String) 它用于将DirectoryInfo实例及其内容移动到新路径。
Refresh() 它用于刷新对象的状态。
SetAccessControl(DirectorySecurity) 它用于设置DirectorySecurity对象描述的访问控制列表(ACL)条目。
ToString() 它返回用户传递的原始路径。

C# DirectoryInfo示例

在下面的例子中,通过指定目录路径来创建一个名称为:yiibai_dir的目录。参考以下示例代码的实现 -

using System;
using System.IO;
namespace CSharpProgram
{
	class Program
	{
		static void Main(string[] args)
		{
			// Provide directory name with complete location.  
			DirectoryInfo directory = new DirectoryInfo(@"F:\worksp\csharp\yiibai_dir");
			try
			{
				// Check, directory exist or not.  
				if (directory.Exists)
				{
					Console.WriteLine("Directory already exist.");
					return;
				}
				// Creating a new directory.  
				directory.Create();
				Console.WriteLine("The directory is created successfully.");
			}
			catch (Exception e)
			{
				Console.WriteLine("Directory not created: {0}", e.ToString());
			}
		}
	}
}

执行上面示例代码,得到以下结果 -

The directory is created successfully.

打开目录:F:\worksp\csharp应该能看到有一个名称为:yiibai_dir的目录。

DirectoryInfo类还提供删除创建的目录的删除方法。

C# DirectoryInfo示例:删除目录

在以下程序中,我们将删除在上面示例程序中创建的yiibai_dir目录。

using System;
using System.IO;
namespace CSharpProgram
{
	class Program
	{
		static void Main(string[] args)
		{
			// Providing directory name with complete location.  
			DirectoryInfo directory = new DirectoryInfo(@"F:\worksp\csharp\yiibai_dir");
			try
			{
				// Deleting directory  
				directory.Delete();
				Console.WriteLine("The directory is deleted successfully.");
			}
			catch (Exception e)
			{
				Console.WriteLine("Something went wrong: {0}", e.ToString());
			}
		}
	}
}

执行上面示例代码,得到以下结果 -

The directory is deleted successfully.

打开目录:F:\worksp\csharp应该能看到yiibai_dir目录已经被删除了。

如果指定位置不存在目录,它将抛出一个System.IO.DirectoryNotFoundException异常。您可以自己修改上面代码测试一下。

序列化

在 C# 中,序列化是将对象转换为字节流的过程,以便将其保存到内存,文件或数据库。序列化的反向过程称为反序列化。

序列化可在远程应用程序的内部使用。

C# SerializableAttribute

要序列化对象,需要将SerializableAttribute属性应用在指定类型上。如果不将SerializableAttribute属性应用于类型,则在运行时会抛出SerializationException异常。

C# 序列化示例

下面看看 C# 中序列化的简单例子,在这个示例中将序列化Student类的对象。在这里使用BinaryFormatter.Serialize(stream,reference)方法来序列化对象。

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
class Student
{
	int rollno;
	string name;
	public Student(int rollno, string name)
	{
		this.rollno = rollno;
		this.name = name;
	}
}
public class SerializeExample
{
	public static void Main(string[] args)
	{
		FileStream stream = new FileStream("F:\\worksp\\csharp\\serialize.txt", FileMode.OpenOrCreate);
		BinaryFormatter formatter = new BinaryFormatter();

		Student s = new Student(1010, "Curry");
		formatter.Serialize(stream, s);

		stream.Close();
	}
}

执行上面示例代码后,应该可以在F:\worksp\csharp目录看到创建了一个文件:serialize.txt,里边有记录对象的相关信息。内容如下所示 -

反序列化

在 C# 编程中,反序列化是序列化的相反过程。开发人员可以从字节流中读取内容并转为对象。在这里,我们将使用BinaryFormatter.Deserialize(stream)方法反序列化流。

C# 反序列化示例

下面来看看 C# 中的反序列化的简单例子。参考以下示例代码 -

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
class Student
{
	public int rollno;
	public string name;
	public Student(int rollno, string name)
	{
		this.rollno = rollno;
		this.name = name;
	}
}
public class DeserializeExample
{
	public static void Main(string[] args)
	{
		FileStream stream = new FileStream(@"F:\worksp\csharp\serialize.txt", FileMode.OpenOrCreate);
		BinaryFormatter formatter = new BinaryFormatter();

		Student s = (Student)formatter.Deserialize(stream);
		Console.WriteLine("Rollno: " + s.rollno);
		Console.WriteLine("Name: " + s.name);

		stream.Close();
	}
}

执行上面示例代码,得到以下结果 -

Rollno: 1010
Name: Curry

System.IO命名空间

System.IO命名空间由IO相关的类,结构,委托和枚举组成。这些类可用于将数据读取和写入文件或数据流。它还包含用于文件和目录支持的类。

C# System.IO命名空间类

以下是位于System.IO命名空间中的类。

类名 描述
BinaryReader 它用于读取原始数据类型作为指定编码中的二进制值。
BinaryWriter 它用于将二进制中的原始类型写入流。
BufferedStream 它用于添加缓冲层来读取和写入另一个流的操作。这是一个密封类,其它类不继承此类。
Directory 它用于公开通过目录和子目录创建,移动和枚举的静态方法。这是一个密封类,其它类不继承此类。
DirectoryInfo 它用于公开通过目录和子目录创建,移动和枚举的实例方法。这是一个密封类,其它类不继承此类。
DirectoryNotFoundException 它用于处理与文件或目录无关的异常。
DriveInfo 它用于访问驱动器上的信息。
DriveNotFoundException 它用于处理驱动器找不到的异常。
EndOfStreamException 它用于处理流终止的异常。
ErrorEventArgs 它为FileSystemWatcher.Error事件提供数据。
File 这个类为单个文件的创建,复制,删除,移动和打开提供了一些静态方法。
FileFormatException 它用于处理文件格式的异常。
FileInfo 它用于提供用于创建,复制,删除,移动和打开文件的属性和实例方法。
FileLoadException 它用于处理文件加载异常。
FileNotFoundException 它用于处理文件找不到异常。
FileStream 它提供一个文件流,支持同步和异步读写操作。
FileSystemEventArgs 它提供目录事件的数据。
FileSystemInfo 它为FileInfoDirectoryInfo对象提供基类。
FileSystemWatcher 它会监听文件系统更改通知,并在目录中的目录或文件中引发事件更改。
InternalBufferOverflowException 此类用于处理内部缓冲区溢出异常。
InvalidDataException 它用于处理无效数据异常。
IODescriptionAttribute 它设置视觉设计器在引用事件,扩展器或属性时可以显示的描述。
IOException 它是处理I/O错误的异常类。
MemoryStream 它用于创建一个其后备存储是内存的流。
Path 它对包含文件或目录路径信息的String实例执行操作。
PathTooLongException 它是一个异常类,用于处理路径太长的异常。
PipeException 这个异常类用于处理与管道相关的异常。
RenamedEventArgs 它用于为“重命名”事件提供数据。
Stream 它用于提供字节序列的通用视图。这是一个抽象类。
StreamReader 它用于实现从字节流读取字符的TextReader类。
StringReader 它用于实现从字符串读取的TextReader类。
StringWriter 它用于实现一个TextWriter类,用于将信息写入字符串。 信息存储在一个基础的StringBuilder中。
TextReader 此类用于表示可以读取一系列连续字符的读取器。
TextWriter 此类用于表示可以编写一系列连续字符的写入器。
UnmanagedMemoryAccessor 它用于从托管代码提供对非托管内存块的随机访问。
UnmanagedMemoryStream 它用于从托管代码访问非托管内存块。

System.IO命名空间结构

以下是System.IO命名空间中的结构。

结构 描述
WaitForChangedResult 它包含有关发生变化的信息。

System.IO命名空间委托

System.IO命名空间包含以下委托 -

委托 描述
ErrorEventHandler 它表示处理FileSystemWatcher对象Error事件的方法。
FileSystemEventHandler 它表示处理FileSystemWatcher类的已更改,创建或已删除事件的方法。
RenamedEventHandler 它表示将处理FileSystemWatcher类的重命名事件的方法。

System.IO命名空间枚举

下表列出System.IO命名空间中的枚举。

枚举 描述
DriveType 它用于定义驱动器类型的常量,包括:CDROM,固定,网络等。
FileAccess 它用于定义对文件进行读取,写入或读取/写入访问的常量。
FileAttributes 它用于提供文件和目录的属性。
FileMode 它用于指定操作系统应如何打开文件。
FileOptions 它用于表示创建FileStream对象的高级选项。
FileShare 它用于包含用于控制其他FileStream对象可以对同一文件进行访问的类型的常量。
HandleInheritability 它指定底层句柄是否可由子进程继承。
NotifyFilters 它用于监视指定要在文件或文件夹中的更改。
SearchOption 它用于指定是搜索当前目录还是当前目录以及所有子目录。
SeekOrigin 它用于指定要用于搜索的流中的位置。
WatcherChangeTypes 文件或目录可能会发生更改。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇