IO流
微软的.Net框架为我们提供了基于流的I/O操作方式,这样通过运用System.IO.DirectoryInfo类和System.IO.FileInfo类我们可以轻易的完成与目录和文件相关的操作,而通过运用System.IO.StreamReader类和System.IO.StreamWriter类我们可以方便的完成与文件的读写相关的操作。大大简化了开发者的工作。因为我们可以对一系列的通用对象进行操作,而不必关心该I/O操作是和本机的文件有关还是和网络中的数据有关。
1.目录下的文件操作
运用DirectoryInfo类的对象我们可以轻松的实现对目录以及和目录中的文件相关的操作,假如你要获得某个目录F:\Pictures下的所有BMP文件,那么通过下面的代码就可以实现该功能。
DirectoryInfo dir = new DirectoryInfo(@"F:\ Pictures");
FileInfo[] bmpfiles = dir.GetFiles("*.bmp);
Console.WriteLine("Total number of bmp files", bmpfiles.Length);
Foreach( FileInfo f in bmpfiles)
{
Console.WriteLine("Name is : {0}", f.Name);
Console.WriteLine("Length of the file is : {0}", f.Length);
Console.WriteLine("Creation time is : {0}", f.CreationTime);
Console.WriteLine("Attributes of the file are : {0}",
f.Attributes.ToString());
}
2.创建子目录
运用DirectoryInfo类创建子目录是非常容易的,你只要调用其中CreateSubdirectory()方法即可,演示代码如下。
DirectoryInfo dir = new DirectoryInfo(@"F:\ Pictures");
try
{
dir.CreateSubdirectory("Sub");
dir.CreateSubdirectory(@"Sub\MySub");
}
catch(IOException e)
{
Console.WriteLine(e.Message);
}
3.运用FileInfo类创建、删除文件
通过FileInfo类,我们可以方便地创建出文件,并可以访问文件的属性同时还可以对文件进行打开文件、关闭文件、读写文件等基本的操作。下面的代码显示了如何创建一个文本文件并且去访问其创建时间、文件的绝对路径以及文件属性等文件信息,最后程序还给出了删除文件的方法。
FileInfo fi = new FileInfo(@"F:\Myprogram.txt");
FileStream fs = fi.Create();
Console.WriteLine("Creation Time: {0}",fi.CreationTime);
Console.WriteLine("Full Name: {0}",fi.FullName);
Console.WriteLine("FileAttributes: {0}",fi.Attributes.ToString());
Console.WriteLine("Press any key to delete the file");
Console.Read();
fstr.Close();
fi.Delete();
下面介绍C#中流处理相关类及方法。
1.BinaryReader 和 BinaryWrite类,以二进制格式操作数据
Close() 关闭当前阅读器及基础流
Read() 从基础流中读取字符并前移流的当前位置
ReadDecimal() 从当前流中读取十进制数值,并将该流的当前位置前移16个字节
ReadByte() 从当前流中读取下一个字节,并将在流中的位置向前移动1个字节
2.Stream类
Stream类是IO名称空间中最重要的类之一,它是派生FileStream、MemoryStream和BufferedStream等不同类的抽象类
3.MemoryStream类用于向内存(而不是磁盘)读写数据
Read() 读MemoryStream并装值写入缓冲区
ReadByte() 从MemoryStream读一个字节
Write() 从缓冲区向MemoryStream写值
WriteByte() 从缓冲区向MemoryStream写一个字节
WriteTo() 将此内存流的内容写入别一个内存流
4.BufferedStream类用于对缓冲区进行读/写。有两个构造函数
public BufferedStream(Stream stName);
public BufferedStream(Stream stName, int bsize); // bsize表示缓冲区大小
static void Main(string[] args) { MemoryStream memStr = new MemoryStream(); BufferedStream buffStr = new BufferedStream(memStr); buffStr.WriteByte((byte)100); buffStr.Position = 0; //取得memStr的当前位置Positon属性为0,以便buffStr的当前位置设置为流的开始 byte[] arrb = { 1, 2, 3 }; buffStr.Read(arrb, 0, 1); // 用流的当前位置的值填充字节数组arrb for (int i = 0; i < 3; i++) { Console.WriteLine("这个值是{0}", arrb[i]); } Console.WriteLine("ReadByte()的返回值是{0}", buffStr.ReadByte()); // 返回-1表示流的末尾 Console.ReadKey(); }
5.FileStream类
FileStream 类用于对文件执行读/写操作,Read()和Write()方法用于读/写操作
FileStream类构造函数有许多重写形式,以方便创建该类的实例:
FileStream(string FilePath,FileMode)
FileStream(stirng FilePath,FileMode,FileAccess)
FileStream(string FilePath,FileMode,FileAccess,FileShare)
FileMode为enum类型,其值如下:
Append:打开一个文件并查找到文件末尾,以便能够附加新的数据,如果文件不存在,则新建一个文件
Create:用指定名称新建一个文件,如果存在具有相同名称的文件,则覆盖旧文件
CreateNew:新建一个文件
Open:打开一个文件,指定文件必须存在
OpenOrCreate:与Open类似,只是指定文件不存在时,新建一个
Truncate:根据此枚举,打开指定文件并将之截断为0字节(大小为0字节),文件必须存在
FileAccess枚举值:Read / Write / ReadWrite
FileShare枚举值:
None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求都将失败
Read:只能对文件进行读取操作
Write:可以对文件进行写入操作
ReadWrite:可以进行对文件的读写和写入两种操作
static void Main(string[] args) { Console.WriteLine("输入文件的名称:"); string filename = Console.ReadLine(); FileStream fileStr = new FileStream(filename, FileMode.OpenOrCreate); BinaryWriter binWrt = new BinaryWriter(fileStr); for (int i = 0; i < 20; i++) { binWrt.Write(i); } binWrt.Close(); fileStr.Close(); fileStr = new FileStream(filename, FileMode.Open, FileAccess.Read); BinaryReader binRead = new BinaryReader(fileStr); for (int i = 0; i < 20; i++) { Console.WriteLine(binRead.ReadInt32()); } binRead.Close(); fileStr.Close(); Console.ReadKey(); }
6.TextReader类
TextReader类是StreamReader和StringReader类的抽象基类,可用于读取有序的字符序列
Read() 读取输入流中的下一个字符或下一组字符
ReadLine() 从当前流中读取一行字符并将数据作为字符串返回
ReadToEnd() 从流的当前位置到末尾读取流
class Program { static string ans = "y"; static void Main(string[] args) { Console.WriteLine("1.读取文件"); Console.WriteLine("2.读取字符串"); try { Reading(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadKey(); } } static void Reading() { if (ans == "Y" || ans == "y") { Console.Write("输入你的选择[1/2]:"); int choice = Convert.ToInt32(Console.ReadLine()); if (choice == 1) { Console.WriteLine("输入文件名:"); string filename = Console.ReadLine(); if (!File.Exists(filename)) { Console.WriteLine(filename + "不存在!"); return; } StreamReader sr = File.OpenText(filename); string input; while ((input = sr.ReadLine()) != null) { Console.WriteLine(input); } Console.WriteLine("已达到流末尾。"); sr.Close(); Console.Write("要继续吗?[Y/N]:"); ans = Console.ReadLine(); Reading(); } else if (choice == 2) { Console.Write("输入字符串:"); string str = Console.ReadLine(); char[] b = new char[str.Length]; StringReader sr = new StringReader(str); sr.Read(b, 0, str.Length); Console.WriteLine(b); Console.WriteLine("要继续吗[Y/N]:"); ans = Console.ReadLine(); Reading(); } else { Console.WriteLine("输入1或2作为选择:"); } } } }
7.TextWrite类
TextWrite类用于编写有序字符的类的抽象基类。StreamWriter和StringWriter类是TextWriter类的两个派生类
Write() 将数据写入流
WriteLine() 将数据写入流,并在结尾标记结束符
8.StringWriter类用于装数据写入字符串,与StreamWriter类类似,区别仅在于它是向字符串(而不是向流)写入
class Program { static string ans = "y"; static void Main(string[] args) { Writing(); } static void Writing() { if (ans == "Y" || ans == "y") { Console.WriteLine("输入文件名:"); string filename = Console.ReadLine(); if (!File.Exists(filename)) { Console.WriteLine(filename + "不存在!"); return; } StreamWriter sr = File.AppendText(filename); Console.Write("输入要写入的字符串:"); string str = Console.ReadLine(); sr.WriteLine(str); sr.Close(); Console.Write("要继续吗?[Y/N]:"); ans = Console.ReadLine(); Writing(); } } }
浙公网安备 33010602011771号