操作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枚举器有成员: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();
}
}
}
当上述代码被编译并执行时,它产生以下结果:
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类中一此最常用的方法和示例如下所列 -
- 读取和写入文本文件 - 它涉及到阅读和写入文本文件。
StreamReader和StreamWriter类有助于完成它。 - 读取和写入二进制文件 - 它涉及从二进制文件读取和写入。
BinaryReader和BinaryWriter类有助于完成此操作。 - 操作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表示false,1表示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) | 它用于初始化写入指定StringBuilder的StringWriter类的新实例。 |
| StringWriter(StringBuilder,?IFormatProvider) | 它用于初始化写入指定的StringBuilder的StringWriter类的新实例,并具有指定的格式提供程序。 |
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 | 它为FileInfo和DirectoryInfo对象提供基类。 |
| 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 | 文件或目录可能会发生更改。 |


