以字节形式向磁盘写入数据通常称为字节流(比特流)
常常使用System.Io
常用的类
| 类 | 说明 | 
| File | 提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。 | 
| FileInfo | 提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。无法继承此类。 | 
| FileStream | 公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。 | 
| BinaryReader | 用特定的编码将基元数据类型读作二进制值。 | 
| BinaryWriter | 以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。 | 
| BufferedStream | 给另一流上的读写操作添加一个缓冲层。无法继承此类。 | 
| Directory | 公开用于创建、移动和枚举通过目录和子目录的静态方法。无法继承此类。 | 
| DirectoryInfo | 公开用于创建、移动和枚举目录和子目录的实例方法。无法继承此类。 | 
| Path | 对包含文件或目录路径信息的 String 实例执行操作。这些操作是以跨平台的方式执行的。 | 
| StreamReader | 实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。 | 
| StreamWriter | 实现一个 TextWriter,使其以一种特定的编码向流中写入字符。 | 
| FileSysWatcher | 侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。 | 
基本使用类的介绍
1.1File
常用方法
类File提供用于创建、复制、删除、移动和打开文件的静态方法
| 方法 | 说明 | 
| Move | 将指定文件移到新位置,并提供指定新文件名的选项。 | 
| Delete | 删除指定的文件。如果指定的文件不存在,则不引发异常。 | 
| Copy | 已重载。 将现有文件复制到新文件。 | 
| CreateText | 创建或打开一个文件用于写入 UTF-8 编码的文本。 | 
| OpenText | 打开现有 UTF-8 编码文本文件以进行读取。 | 
| Open | 已重载。 打开指定路径上的 FileStream。 | 
eg

 1 using System;
 2 using System.IO;
 3 class Test
 4 {
 5     public static void Main()
 6     {
 7         string path = @"c:\temp\123.txt";
 8         if (!File.Exists(path))
 9         {
10             // 创建文件以便写入内容。
11             using (StreamWriter sw = File.CreateText(path))
12             {
13                 sw.WriteLine("Hello");
14                 sw.WriteLine("And");
15                 sw.WriteLine("Welcome");
16             }
17         }
18         // 打开文件从里面读数据。
19         using (StreamReader sr = File.OpenText(path))
20         {
21             string s = "";
22             while ((s = sr.ReadLine()) != null)
23             {
24                 Console.WriteLine(s);
25             }
26         }
27         try
28         {
29             string path2 = path + "temp";
30             // 确认将要拷贝成的文件是否已经有同名的文件存在。
31             File.Delete(path2);
32             // 拷贝文件。
33             File.Copy(path, path2);
34             Console.WriteLine("{0} was copied to {1}.", path, path2);
35             // 删除新生成的文件。
36             File.Delete(path2);
37             Console.WriteLine("{0} was successfully deleted.", path2);
38         }
39         catch (Exception e)
40         {
41             Console.WriteLine("The process failed: {0}", e.ToString());
42         }
43     }
44 }
1.2FileInfo
类FileInfo提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。无法继承此类
| 属性 | 说明 | 
| Attributes         | 获取或设置当前 FileSystemInfo 的 FileAttributes。(从 FileSystemInfo 继承。) | 
| CreationTime  | 获取或设置当前 FileSystemInfo 对象的创建时间。(从 FileSystemInfo 继承。) | 
| Directory | 获取父目录的实例。 | 
| DirectoryName | 获取表示目录的完整路径的字符串。 | 
| Exists | 已重写。获取指示文件是否存在的值。 | 
| Extension  | 获取表示文件扩展名部分的字符串。(从 FileSystemInfo 继承。) | 
获取目录名

 1 using System;
 2 using System.IO;
 3 class Test
 4 {
 5     public static void Main()
 6 {
 7         string fileName = "C:\\autoexec.bat";
 8             FileInfo fileInfo = new FileInfo(fileName);
 9             if (!fileInfo.Exists)
10             {
11                 return;
12             }
13             Console.WriteLine("{0} has a directoryName of {1}",fileName,fileInfo.DirectoryName);
14             /* 下面是代码的处理结果,
15              * 实际的结果因机器不同:
16              *
17              * C:\autoexec.bat has a directoryName of C:\
18              */
19     }
20 }
同磁盘下文件复制问题:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.IO;
 9 namespace FileOptionApplication
10 {
11     public partial class Form1 : Form
12     {
13         public Form1()
14         {
15             InitializeComponent();
16         }
17         /// <summary>
18         /// 复制文本文件
19         /// </summary>
20         private void button1_Click(object sender, EventArgs e)
21         {
22             string somefile = @"C:\Documents and Settings\Administrator\My Documents\SQL Server2000安装故障.txt";
23             string target = @"c:\2.txt";
24             if (!File.Exists(somefile))
25             {
26                 MessageBox.Show("文件不存在!");
27             }
28             else
29             {
30                 if (File.Exists(target))
31                 {
32                     File.Delete(target);
33                 }
34                 File.Copy(somefile, target);
35                 MessageBox.Show("文件复制成功!");
36             }
37         }
38          /// <summary>
39         /// 创建文本文件
40         /// </summary>
41         private void button2_Click(object sender, EventArgs e)
42         {
43             string target = @"c:\2.txt";
44             if (File.Exists(target))
45             {
46                 File.Delete(target);
47             }
48             File.CreateText(target);
49         }
50         /// <summary>
51         /// 删除文本文件
52         /// </summary>
53         private void button3_Click(object sender, EventArgs e)
54         {
55             string target = @"c:\2.txt";
56             if (File.Exists(target))
57             {
58                 File.Delete(target);
59                 MessageBox.Show("文件删除成功!");
60             }
61         }
62     }
63 }
64 
65 ------------------通过FileInfo类执行同样的复制
66 
67    private void button1_Click(object sender, EventArgs e)
68         {
69             string path = @"C:\WINDOWS\IE4 Error Log.txt";
70             string target = @"c:\1.txt";
71             FileInfo myfile = new FileInfo(path);
72             if (!myfile.Exists)
73             {
74                 MessageBox.Show("对不起,未发现路径文件!");
75             }
76             else
77             {
78                 myfile.CopyTo(target);
79                 MessageBox.Show("复制成功!");
80             }
81        }
获取文件的基本信息
向一个Form窗体上拖拽三个Lable控件和一个Button控件,Button控件的text属性设置为“获取文件信息”

代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.IO;
 9  
10 namespace FileOptionApplication
11 {
12     public partial class Form2 : Form
13     {
14         public Form2()
15         {
16             InitializeComponent();
17         }
18          /// <summary>
19         /// 获取文件信息单击事件
20         /// </summary>
21         private void button1_Click(object sender, EventArgs e)
22         {
23             string somefile = @"C:\Documents and Settings\Administrator\My Documents\SQL Server2000安装故障.txt";
24             FileInfo myfile = new FileInfo(somefile);
25             if (myfile.Exists)
26             {
27                 MessageBox.Show("文件已经存在");
28                 label1.Text = "文件创建时间:" + myfile.CreationTime.ToString();
29                 label2.Text = "文件夹:" + myfile.Directory.ToString();
30                 label3.Text = "文件夹名称:" + myfile.DirectoryName.ToString() + ",文件扩展名:" + myfile.Extension.ToString();
31             }
32             else
33             {
34                 MessageBox.Show("文件并不存在");
35             }
36         }
37     }
38 }
1.3 Directory公开用于创建、移动和枚举通过目录和子目录的静态方法
常用的方法
| 方法 | 说明 | 
| Move | 将文件或目录及其内容移到新位置。 | 
| Delete | 已重载。 删除指定的目录。 | 
| CreateDirectory | 已重载。 创建指定路径中的所有目录 | 
| GetCreationTime | 获取目录的创建日期和时间。 | 
| GetCurrentDirectory | 获取应用程序的当前工作目录。 | 
| GetFiles | 已重载。 返回指定目录中的文件的名称 | 
目录创建了多少天

 1 using System;
 2 using System.IO;
 3  
 4 class Test
 5 {
 6     public static void Main()
 7     {
 8         try
 9         {
10             // 获取当前目录的创建时间.
11             DateTime dt = Directory.GetCreationTime(Environment.CurrentDirectory);
12             // 给用户反馈信息.
13             if (DateTime.Now.Subtract(dt).TotalDays > 364)
14             {
15                 Console.WriteLine("This directory is over a year old.");
16             }
17             else if (DateTime.Now.Subtract(dt).TotalDays > 30)
18             {
19                 Console.WriteLine("This directory is over a month old.");
20             }
21             else if (DateTime.Now.Subtract(dt).TotalDays <= 1)
22             {
23                 Console.WriteLine("This directory is less than a day old.");
24             }
25             else
26             {
27                 Console.WriteLine("This directory was created on {0}", dt);
28             }
29         }
30         catch (Exception e)
31         {
32             Console.WriteLine("The process failed: {0}", e.ToString());
33         }
34     }
35 }
目录的相关操作
向一个Form窗体上拖拽五个Button控件,Button控件的text属性设置为“创建目录”、“删除目录”、“移动目录”、“目录创建时间”、“返回指定目录文件”
 
在类Form3里添加二个静态字段directory_path、directory_otherpath,都为string类型,分别代表工作目录路径和其他目录路径;双击“创建目录”、“删除目录”、“移动目录”、“目录创建时间”、“返回指定目录文件”

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Text;
  7 using System.Windows.Forms;
  8 using System.IO;
  9  
 10 namespace FileOptionApplication
 11 {
 12     public partial class Form3 : Form
 13     {
 14         public Form3()
 15         {
 16             InitializeComponent();
 17         }
 18         private static string directory_path = "c:\\qs250";
 19         private static string directory_otherpath = "c:\\qqqq";
 20         /// <summary>
 21         /// 删除目录鼠标单击事件
 22         /// </summary>
 23         private void button1_Click(object sender, EventArgs e)
 24         {
 25             try
 26             {
 27                 Directory.CreateDirectory(directory_path);
 28                 button2.Enabled = true;
 29                 button1.Enabled = false;
 30                 button3.Enabled = true;
 31                 button4.Enabled = true;
 32                 button5.Enabled = true;
 33                 MessageBox.Show("文件夹成功建立。", "警报");
 34             }
 35             catch (Exception mm)
 36             {
 37                 MessageBox.Show("磁盘操作错误,原因:" + Convert.ToString(mm), "警报");
 38             }
 39         }
 40         /// <summary>
 41         /// 删除目录鼠标单击事件
 42         /// </summary>
 43         private void button2_Click(object sender, EventArgs e)
 44         {
 45             try
 46             {
 47                 Directory.Delete(directory_path);
 48                 button2.Enabled = false;
 49                 button1.Enabled = true;
 50                 button3.Enabled = false;
 51                 button4.Enabled = false;
 52                 button5.Enabled = false;
 53                 MessageBox.Show("文件夹删除建立。", "警报");
 54             }
 55             catch (Exception mm)
 56             {
 57                 MessageBox.Show("磁盘操作错误,原因:" + Convert.ToString(mm), "警报");
 58             }
 59         }
 60         /// <summary>
 61         /// 移动目录鼠标单击事件
 62         /// </summary>
 63         private void button3_Click(object sender, EventArgs e)
 64         {
 65             try
 66             {
 67                 Directory.Move(directory_path, directory_otherpath);
 68                 MessageBox.Show("文件夹移动成功。", "警报");
 69                 //举例来讲,如果您尝试将c:\mydir 移到c:\public,并且c:\public 已存在,
 70                 //则此方法引发IOException。您必须将“c:\\public\\mydir”指定为destDirName 参数,或者指定新目录名,例如“c:\\newdir”。
 71             }
 72             catch (Exception mm)
 73             {
 74                 MessageBox.Show("磁盘操作错误,原因:" + Convert.ToString(mm), "警报");
 75             }
 76         }
 77         /// <summary>
 78         /// 目录创建时间鼠标单击事件
 79         /// </summary>
 80         private void button4_Click(object sender, EventArgs e)
 81         {
 82             try
 83             {
 84     MessageBox.Show(string.Format("{0:G}",Directory.GetCreationTime(directory_path)), "提示");
 85             //获取时间格式参见DateTimeFormatInfo
 86             }
 87             catch (Exception mm)
 88             {
 89                 MessageBox.Show("磁盘操作错误,原因:" + Convert.ToString(mm), "警报");
 90             }
 91         }
 92         /// <summary>
 93         /// 返回指定目录文件鼠标单击事件
 94         /// </summary>
 95         private void button5_Click(object sender, EventArgs e)
 96         {
 97             try
 98             {
 99                 string[] fileEntries = Directory.GetFiles(directory_path);
100                 if (fileEntries.Length != 0)
101                 {
102                     foreach (string s in fileEntries)
103                     {
104                         if (File.Exists(s))
105                         {
106                             MessageBox.Show("内有文件信息:" + s, "提示");
107                         }
108                     }
109                 }
110                 else
111                 {
112                     MessageBox.Show("空文件夹", "提示");
113                 }
114                 //获取时间格式参见DateTimeFormatInfo
115             }
116             catch (Exception mm)
117             {
118                 MessageBox.Show("磁盘操作错误,原因:" + Convert.ToString(mm), "警报");
119             }
120         }
121     }
122 }
1.4 file类读取文本文件的方法
| 方法 | 说明 | 
| CreateText(string FilePath) | 创建或打开一个文件用于写入 UTF-8 编码的文本。 | 
| OpenText(string FilePath) | 打开现有 UTF-8 编码文本文件以进行读取。 | 
| Open(string FilePath, FileMode) | 打开指定路径上的 FileStream,具有读/写访问权限。 | 
| Create(string FilePath) | 在指定路径中创建文件。 | 
| OpenRead(string FilePath) | 打开现有文件以进行读取。 | 
| AppendText(string FilePath) | 创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件。 | 
案例写一个记事本
向一个Form窗体上拖拽两个GroupBox控件,text属性分别设置为“写入文本”、“命名文本文件:”;向两个GroupBox控件里拖拽一个RichTextBox控件和一个TextBox控件;向第一个GroupBox控件里拖拽二个Button控件,属性分别设置为“保存编辑文件”、“打开文本文件”;向第二个GroupBox控件里拖拽一个Button控件,text属性设置为“创建文本文件”

在案例中添加一个静态字段directory_path,string类型,代表工作目录路径;双击“保存编辑文件”、“打开文本文件”、“创建文本文件”,在click事件处理方法里分别添加代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.IO;
 9  
10 namespace FileOptionApplication
11 {
12     public partial class Form4 : Form
13     {
14         public Form4()
15         {
16             InitializeComponent();
17         }
18         private static string directory_path = "c:\\";
19         /// <summary>
20         /// 创建文本文件
21         /// </summary>
22         private void button1_Click(object sender, EventArgs e)
23         {
24             try
25             {
26                 if (textBox1.Text.Length == 0)
27                 {
28                     MessageBox.Show("文件名禁止为空!", "警报");
29                 }
30                 else
31                 {
32                     directory_path = directory_path + textBox1.Text.Trim() + ".txt";
33                     //File.CreateText(..)返回的是一个StreamWriter
34                     StreamWriter sw = File.CreateText(directory_path);
35                     button2.Enabled = true;
36                     button3.Enabled = true;
37                     button1.Enabled = false;
38                     richTextBox1.Enabled = true;
39                     MessageBox.Show("文件文件成功建立。", "消息");
40                     sw.Close();
41                 }
42             }
43             catch (Exception mm)
44             {
45                 MessageBox.Show("磁盘操作错误,原因:" + Convert.ToString(mm), "警报");
46             }
47         }
48         /// <summary>
49         /// 打开文本文件
50         /// </summary>
51         private void button2_Click(object sender, EventArgs e)
52         {
53             try
54             {
55                 OpenFileDialog open = new OpenFileDialog();//创建一个打开的对话框
56                 open.Title = "打开文本文件";
57                 open.FileName = "";
58                 open.AddExtension = true;//设置是否自动在文件中添加扩展名
59                 open.CheckFileExists = true;//检查文件是否存在
60                 open.CheckPathExists = true;//验证路径有效性
61                 open.Filter = "文本文件(*.txt)|*.txt";//设置将打开文件的类型
62                 open.ValidateNames = true;
63                 //文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名
64                 if (open.ShowDialog() == DialogResult.OK)
65                 {
66                  StreamReader sr = new StreamReader(open.FileName, System.Text.Encoding.Default);
67                     this.richTextBox1.Text = sr.ReadToEnd();
68                 }
69                 MessageBox.Show("文件打开成功。", "消息");
70             }
71             catch (Exception mm)
72             {
73                 MessageBox.Show("磁盘操作错误,原因:" + Convert.ToString(mm), "警报");
74             }
75         }
76          /// <summary>
77         /// 保存编辑文件
78         /// </summary>
79         private void button3_Click(object sender, EventArgs e)
80         {
81             try
82             {
83         FileStream textfile = File.Open(directory_path, FileMode.OpenOrCreate, FileAccess.Write);
84                 StreamWriter sw = new StreamWriter(textfile, Encoding.GetEncoding("GB2312"));
85                 sw.Write(richTextBox1.Text.ToString());
86                 MessageBox.Show("文件写成功。", "警报");
87             }
88             catch (Exception mm)
89             {
90                 MessageBox.Show("磁盘操作错误,原因:" + Convert.ToString(mm), "警报");
91             }
92         }
93     }
94 }
1.5FileStream 文件流
用File类提供的方法在创建或打开文件时,总是会产生一个FileStream对象。
(1)使用File对象的Create方法

1        FileStream mikecatstream;
2        mikecatstream = File.Create("c:\\mikecat.txt");
3    //本段代码的含义:
4    //利用类File的Create()方法在C:根目录下创建文件mikecat.txt,并把文件流赋给mikecatstream
(2) 使用File对象的Open方法,‘

1       FileStream mikecatstream;
2       mikecatstream = File.Open("c:\\mikecat.txt", FileMode.OpenOrCreate, FileAccess.Write);
3       //本段代码的含义:
4   //利用类File的Open()方法打开在C:根目录下的文件mikecat.txt,打开的模式为打开或创建,对文件的访问形式为只写,并把文件流赋给mikecatstream。
(3) 使用类FileStream的构造函数

1     FileStream mikecatstream;
2     mikecatstream = new FileStream("c:\\mikecat.txt", FileMode.OpenOrCreate, FileAccess.Write);
3     //本段代码的含义:
4     //利用类FileStream的构造函数打开在C:根目录下的文件mikecat.txt,打开的模式为打开或创建,对文件的访问形式为只写,并把文件流赋给mikecatstream。
最常用的构造函数
| 名称 | 说明 | 
| FileStream(string FilePath, FileMode) | 使用指定的路径和创建模式初始化 FileStream 类的新实例。 | 
| FileStream(string FilePath, FileMode, FileAccess) | 使用指定的路径、创建模式和读/写权限初始化 FileStream 类的新实例。 | 
| FileStream(string FilePath, FileMode, FileAccess, FileShare) | 使用指定的路径、创建模式、读/写权限和共享权限创建 FileStream 类的新实例。 | 
构造函数中使用的枚举类型
| 名称 | 取值 | 说明 | 
| FileMode | Append、Create、CreateNew、Open、OpenOrCreate和Truncate | 指定操作系统打开文件的方式。 | 
| FileAccess | Read、ReadWrite和Write | 定义用于控制对文件的读访问、写访问或读/写访问的常数。 | 
| FileShare | Inheritable、None、Read、ReadWrite和Write | 包含用于控制其他 FileStream 对象对同一文件可以具有的访问类型的常数。 | 
实例

1 FileStream fstream = new FileStream("Test.cs", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
2 //本段代码的含义:
3 //利用类FileStream的构造函数打开当前目录下的文件Test.cs,打开的模式为打开或创建,对文/的访问形式为读写,共享模式为拒绝共享,并把文件流赋给fstream。
关于FileMode和FileAccess,FileShare这三个枚举类型值
| 成员名称 | 说明 | 
| Append | 打开现有文件并查找到文件尾,或创建新文件。FileMode.Append 只能同 FileAccess.Write 一起使用。任何读尝试都将失败并引发 ArgumentException。  | 
| Create | 指定操作系统应创建新文件。如果文件已存在,它将被改写。这要求 FileIOPermissionAccess.Write。System.IO.FileMode.Create 等效于这样的请求:如果文件不存在,则使用 CreateNew;否则使用 Truncate。  | 
| CreateNew | 指定操作系统应创建新文件。此操作需要 FileIOPermissionAccess.Write。如果文件已存在,则将引发 IOException。 | 
| Open | 指定操作系统应打开现有文件。打开文件的能力取决于 FileAccess 所指定的值。如果该文件不存在,则引发 System.IO.FileNotFoundException。 | 
| OpenOrCreate | 指定操作系统应打开文件(如果文件存在);否则,应创建新文件。如果用 FileAccess.Read 打开文件,则需要 FileIOPermissionAccess.Read。如果文件访问为FileAccess.Write 或 FileAccess.ReadWrite,则需要 FileIOPermissionAccess.Write。如果文件访问为 FileAccess.Append,则需要 FileIOPermissionAccess.Append。 | 
| Truncate | 指定操作系统应打开现有文件。文件一旦打开,就将被截断为零字节大小。此操作需要 FileIOPermissionAccess.Write。试图从使用 Truncate 打开的文件中进行读取将导致异常。 | 
| 成员名称 | 说明 | 
| Read | 对文件的读访问。可从文件中读取数据。同 Write 组合即构成读写访问权。 | 
| ReadWrite | 对文件的读访问和写访问。可从文件读取数据和将数据写入文件。 | 
| Write | 文件的写访问。可将数据写入文件。同 Read 组合即构成读/写访问权。 | 
| 成员名称 | 说明 | 
| Delete | 允许随后删除文件。 | 
| Inheritable | 使文件句柄可由子进程继承。Win32 不直接支持此功能。 | 
| None | 谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。  | 
| Read | 允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。 | 
| ReadWrite | 允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。 | 
| Write | 允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。  | 
| 对于FileMode,如果要求的模式与文件的现有状态不一致,就会抛出一个异常。如果文件不存在,Append、Open和Truncate会抛出一个异常,如果文件存在,CreateNew会抛出一个异常。Create和OpenOrCreate可以处理这两种情况,但Create会删除现有的文件,创建一个新的空文件。FileAccess 和FileShare枚举是按位标志,所以这些值可以与C#的按位OR运算符|合并使用。 | 
1****2 文件的读写
通过一个窗体,如图3-7所示,在点击相应按钮控件时,可以完成对文件的读写操作、磁盘操作以及对目录的管理操作。通过本案例使读者快速掌握操作文件、目录的技术方法及类FileStream的应用。
从工具箱之中拖拽五个GroupBox控件到Form窗体上,text属性分别设置为:“文件管理”、“读写文件操作”、“文件磁盘操作”、“设置文件属性”、“目录管理”;向第一个GroupBox控件拖拽一个RichTextBox控件;再向第一个GroupBox控件拖拽一个Button控件,text属性设置为“关闭”;向第二个GroupBox控件拖拽一个ComboBox控件,text属性设置为“写入类型选择:”,Items属性中添加“创建空文本文件”、“添加入文本文件”、“新写入文本文件”;再向第二个GroupBox控件拖拽二个Button控件,text属性分别设置为“写入文件”、“读出文件”;向第三个GroupBox控件拖拽一个ComboBox控件,text属性设置为“文件磁盘操作选择:”,Items属性中添加“文件创建”、“文件删除”、“文件复制”、“文件移动”;再向第三个GroupBox控件拖拽一个Button控件,text属性设置为“文件磁盘操作”;向第四个GroupBox控件拖拽二个CheckBox控件,text属性分别设置为“只读”、“隐藏”;再向第四个GroupBox控件拖拽一个Button控件,text属性设置为“属性确认”;向第五个GroupBox控件拖拽一个ComboBox控件,text属性分别设置为“文件目录操作选择:”,Items属性中添加“创建文件夹”、“文件夹删除”、“文件夹移动”、“获取子文件信息”;再向第五个GroupBox控件拖拽一个Button控件,text属性设置为“文件目录操作”。

代码

  1 //=========================第一部分:主界面功能设计=============================
  2 using System;
  3 using System.Collections.Generic;
  4 using System.ComponentModel;
  5 using System.Data;
  6 using System.Drawing;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.IO;
 10  
 11 namespace FileOptionApplication
 12 {
 13     public partial class Form6 : Form
 14     {
 15         public Form6()
 16         {
 17             InitializeComponent();
 18         }
 19         /// <summary>
 20         /// 读写文件操作
 21         /// </summary>
 22         private void button3_Click(object sender, EventArgs e)
 23         {
 24             int p = comboBox1.SelectedIndex;
 25             if (p == -1)
 26             {
 27                 MessageBox.Show("请您选择文件写入方式", "警告信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
 28             }
 29             else
 30             {
 31                 string filecontent = richTextBox1.Text.Trim();
 32                 MyFileOption myoption = new MyFileOption();
 33                 string filepath = @"c:\1.txt";
 34                 bool i = myoption.WriteTextFile(filepath, filecontent, Convert.ToInt16(comboBox1.SelectedIndex));
 35                 if (i == true)
 36                 {
 37                     MessageBox.Show("保存成功", "保存信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
 38                 }
 39                 else
 40                 {
 41                     MessageBox.Show("写入文件时出错", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
 42                 }
 43             }
 44         }
 45         /// <summary>
 46         /// 文件磁盘操作
 47         /// </summary>
 48         private void button4_Click(object sender, EventArgs e)
 49         {
 50             Int16 p = Convert.ToInt16(comboBox2.SelectedIndex);
 51             if (p == -1)
 52             {
 53                 MessageBox.Show("请您选择磁盘文件操作方式", "警告信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
 54             }
 55             else
 56             {
 57                 string sourcepath = "c:\\1.txt";
 58                 string targetpath = "c:\\2.txt";
 59                 MyFileOption myoption = new MyFileOption();
 60                 bool i = myoption.DiskFileOption(sourcepath, targetpath, p);
 61                 if (i == true)
 62                 {
 63                     MessageBox.Show("磁盘文件操作成功", "保存信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
 64                 }
 65                 else
 66                 {
 67                     MessageBox.Show("磁盘文件操作时出错", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
 68                 }
 69             }
 70         }
 71         private void button1_Click(object sender, EventArgs e)
 72         {
 73             richTextBox1.Text = null;
 74             richTextBox1.Focus();
 75         }
 76         /// <summary>
 77         /// 读出文本文件内容
 78         /// </summary>
 79         private void button2_Click(object sender, EventArgs e)
 80         {
 81             MyFileOption myoption = new MyFileOption();
 82             string filepath = @"c:\1.txt";
 83             Int16 i = 0;
 84             string filecontent = "";
 85             myoption.ReadTextFile(filepath, out i, out filecontent);
 86             if (i == 0)
 87             {
 88                 MessageBox.Show(filecontent, "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
 89                 richTextBox1.Text = filecontent;
 90             }
 91             else if (i == 1)
 92             {
 93                 richTextBox1.Text = filecontent;
 94                 MessageBox.Show("读取文件成功", "成功", MessageBoxButtons.OK, MessageBoxIcon.Warning);
 95             }
 96             else if (i == 2)
 97             {
 98                 richTextBox1.Text = filecontent;
 99                 MessageBox.Show(filecontent, "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
100             }
101         }
102         /// <summary>
103         /// 文件基本属性设置
104         /// </summary>
105         private void button5_Click(object sender, EventArgs e)
106         {
107             string filepath = @"c:\1.txt";
108             if (checkBox1.Checked && checkBox2.Checked)
109             {
110                 File.SetAttributes(filepath, FileAttributes.ReadOnly | FileAttributes.Hidden);
111                 MessageBox.Show("文件已经改为只读且隐藏", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
112             }
113             else
114             {
115                 if (!checkBox1.Checked && !checkBox2.Checked)
116                 {
117                     File.SetAttributes(filepath, FileAttributes.Archive);
118                     MessageBox.Show("文件已经改为正常", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
119                 }
120                 else
121                 {
122                     if (checkBox2.Checked)
123                     {
124                         File.SetAttributes(filepath, FileAttributes.ReadOnly);
125                         MessageBox.Show("文件已经改为只读", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
126                     }
127                     if (checkBox1.Checked)
128                     {
129                         File.SetAttributes(filepath, FileAttributes.Hidden);
130                         MessageBox.Show("文件已经改为隐藏", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
131                     }
132                 }
133             }
134         }
135         /// <summary>
136         /// 文件夹操作
137         /// </summary>
138         private void button6_Click(object sender, EventArgs e)
139         {
140             Int16 p = Convert.ToInt16(comboBox3.SelectedIndex);
141             if (p == -1)
142             {
143                 MessageBox.Show("请您选择文件夹操作方式", "警告信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
144             }
145             else
146             {
147                 string sourcepath = @"c:\1";
148                 string targetpath = @"c:\2";
149                 MyFileOption myoption = new MyFileOption();
150                 string[] filesname = null;
151                 bool i = myoption.DirectoryOption(sourcepath, targetpath, p, out filesname);
152                 if (i == true)
153                 {
154                     MessageBox.Show("磁盘文件夹操作成功", "保存信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
155                     if (filesname != null)
156                     {
157                         foreach (string somestring in filesname)
158                         {
159                             richTextBox1.Text += somestring + "\r\n";
160                         }
161                     }
162                 }
163                 else
164                 {
165                     MessageBox.Show("磁盘文件夹操作时出错", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
166                 }
167             }
168         }
169     }
170 }

向FileOption.cs文件中添加代码如下:

  1 //==============================第二部分:类设计============================
  2 using System;
  3 using System.Collections.Generic;
  4 using System.Text;
  5 using System.IO;
  6  
  7 namespace FileOptionApplication
  8 {
  9     class MyFileOption
 10     {
 11         /// <summary>
 12         /*******************************************************
 13         **方法 名:WriteTextFile
 14         **输入参数:filepath:文件路径;
 15         **          filecontent:写入文件的内容
 16         **          WriteMethord:写入方法(0:打开并创建文件;1:添加文本;2:新建文本)
 17         **输出参数:逻辑类型参数
 18         **返 回 值:bool
 19         **创建 人:钱哨
 20         **创建日期:09-7-9
 21         **描    述:打开存放在某目录下名称为filepath文件,并在该文件中写入filecontent。
 22         *******************************************************/
 23         public bool WriteTextFile(string filepath, string filecontent, Int16 WriteMethord)
 24         {
 25             bool i = true;
 26             try
 27             {
 28                 if (WriteMethord == 0)
 29                 {
 30               FileStream textfile = File.Open(filepath, FileMode.OpenOrCreate, FileAccess.Write);
 31                     StreamWriter sw = new StreamWriter(textfile, Encoding.Default);
 32                     sw.Write(filecontent);
 33                     i = true;
 34                     sw.Close();
 35                     textfile.Close();
 36                 }
 37                 else if (WriteMethord == 1)
 38                 {
 39                     FileStream textfile = File.Open(filepath, FileMode.Append, FileAccess.Write);
 40                     StreamWriter sw = new StreamWriter(textfile, Encoding.Default);
 41                     sw.Write(filecontent);
 42                     i = true;
 43                     sw.Close();
 44                     textfile.Close();
 45                 }
 46                 else if (WriteMethord == 2)
 47                 {
 48                     FileStream textfile = File.Open(filepath, FileMode.Create, FileAccess.Write);
 49                     StreamWriter sw = new StreamWriter(textfile, Encoding.Default);
 50                     sw.Write(filecontent);
 51                     i = true;
 52                     sw.Close();
 53                     textfile.Close();
 54                 }
 55                 return i;
 56             }
 57             catch
 58             {
 59                 i = false;
 60                 return i;
 61             }
 62         }
 63         /// <summary>
 64         /*******************************************************
 65         **方法 名:DiskFileOption
 66         **输入参数:SourcePath:源文件路径;
 67         **           TargetPath:目的文件路径;
 68         **           OptionMethord:操作类别;0:文件创建;1:文件删除;2:文件复制;3:文件移动
 69         **输出参数:逻辑类型参数
 70         **返 回 值:bool
 71         **创 建 人:钱哨
 72         **创建日期:09-7-9
 73         **描    述:对磁盘文件实施基本操作。
 74         *******************************************************/
 75         public bool DiskFileOption(string SourcePath, string TargetPath, Int16 OptionMethord)
 76         {
 77             bool i = true;
 78             try
 79             {
 80                 if (OptionMethord == 0)
 81                 {
 82                    //文件创建
 83                     FileStream textfile = File.Create(SourcePath);
 84                     textfile.Close();
 85                 }
 86                 else if (OptionMethord == 1)
 87                 {
 88                     //文件删除
 89                     File.Delete(SourcePath);
 90                 }
 91                 else if (OptionMethord == 2)
 92                 {
 93                     //文件复制
 94                     File.Copy(SourcePath, TargetPath, true);
 95                 }
 96                 else if (OptionMethord == 3)
 97                 {
 98                     //文件移动
 99                     File.Move(SourcePath,TargetPath);
100                 }
101                 return i;
102             }
103             catch
104             {
105                 i = false;
106                 return i;
107             }
108         }
109 
110   /// <summary>
111         /*******************************************************
112         **方法 名:ReadTextFile
113         **输入参数:filepath:文件路径;
114         **输出参数:i:读取类型(1:正常;2:文件读取错误;3:文件或路径无效);
115         **          filecontent:返回内容
116         **返 回 值:逻辑类型参数
117         **创 建 人:钱哨
118         **创建日期:09-7-9
119         **描    述:读取存放在某目录下名称为filepath文件内容。
120         *******************************************************/
121         public void ReadTextFile(string filepath, out Int16 i, out string filecontent)
122         {
123             if (File.Exists(filepath))
124             {
125                 try
126                 {
127               StreamReader textreader = new StreamReader(filepath, System.Text.Encoding.Default);
128                     filecontent = textreader.ReadToEnd();
129                     textreader.Close();
130                     i = 1;
131                 }
132                 catch
133                 {
134                     i = 2;
135                     filecontent = "文件读取错误!";
136                 }
137             }
138             else
139             {
140                 i = 0;
141                 filecontent = "文件或路径无效!";
142             }
143         }
144         /// <summary>
145         /*******************************************************
146         **方法 名:DirectoryOption
147         **输入参数:filepath:文件路径;
148         **输出参数:i:读取类型 (0:创建文件夹;1:文件夹删除;2:文件夹移动;3:获取文件夹下面所有的子文件信息)  filecontent:返回内容
149         **返 回 值:逻辑类型参数
150         **创 建 人:钱哨
151         **创建日期:09-7-9
152         **描    述:读取存放在某目录下名称为filepath文件内容。
153         *******************************************************/
154         /// <summary>
155         public bool DirectoryOption(string Directorypath, string TargetDirectorypath, Int16 OptionMethord, out string[] filesname)
156         {
157             bool k = true;
158             filesname = null;
159             if (Directory.Exists(Directorypath))
160             {
161                 try
162                 {
163                     if (OptionMethord == 0)
164                     {
165                         //创建文件夹
166                         Directory.CreateDirectory(Directorypath);
167                     }
168                     else if (OptionMethord == 1)
169                     {
170                         //文件夹删除
171                         Directory.Delete(Directorypath, true);
172                     }
173                     else if (OptionMethord == 2)
174                     {
175                         //文件夹移动
176                         Directory.Move(Directorypath, TargetDirectorypath);
177                     }
178                     else if (OptionMethord == 3)
179                     {
180                         //获取文件夹下面所有的子文件信息
181                         filesname = Directory.GetFiles(Directorypath);
182                     }
183                 }
184                 catch
185                 {
186                     k = false;
187                 }
188             }
189             else
190             {
191                 Directory.CreateDirectory(Directorypath);
192                 k = true;
193             }
194             return k;
195         }
196     }
197 }
文件流FileStream综合案例
从工具箱之中拖拽三个GroupBox控件到Form窗体上,text属性分别设置为:“添加物理路径”、“打开文本文件”、“文本编辑区”;向第一个GroupBox控件拖拽一个TextBox控件;再向第一个GroupBox控件拖拽一个Button控件,text属性设置为“选定文件夹”;向第二个GroupBox控件拖拽一个TextBox控件;再向第二个GroupBox控件拖拽一个Button控件,text属性设置为“选定文件”;向第三个GroupBox控件拖拽一个richTextBox控件;再向窗体上非GroupBox区域拖拽一个Button控件,text属性设置为“保存文本文件”。


 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.IO;
 9  
10 namespace FileOptionApplication
11 {
12     public partial class Form11 : Form
13     {
14         public Form11()
15         {
16             InitializeComponent();
17         }
18         //添加变量TypeW,int类型,0为默认,1为打开文件夹并建立new.txt文件,2为打开文本文件
19         int TypeW = 0;
20         /// <summary>
21         /// 选定某个文件夹
22         /// </summary>
23         private void button1_Click(object sender, EventArgs e)
24         {
25             //新建文件夹
26             FolderBrowserDialog openfolder = new FolderBrowserDialog();
27             if (openfolder.ShowDialog ()== DialogResult.OK)
28             {
29                 textBox1.Text = Convert.ToString(openfolder.SelectedPath);
30                 TypeW = 1;
31             }
32         }
33         /// <summary>
34         /// 选定某个文件夹下面的文本文件
35         /// </summary>
36         private void button4_Click(object sender, EventArgs e)
37         {
38             OpenFileDialog openfile = new OpenFileDialog();
39             openfile.Filter = "文本文件|*.txt";
40             if (openfile.ShowDialog() == DialogResult.OK)
41             {
42     FileStream OpenFileStream = new FileStream(openfile.FileName, FileMode.Open, FileAccess.Read);
43                 StreamReader sr = new StreamReader(OpenFileStream, Encoding.Default);
44                 richTextBox1.Text = sr.ReadToEnd();
45                 textBox2.Text = Convert.ToString(openfile.FileName);
46                 OpenFileStream.Close();
47                 sr.Close();
48                 TypeW = 2;
49             }
50         }
51         /// <summary>
52         /// 保存文本文件
53         /// </summary>
54         private void button2_Click(object sender, EventArgs e)
55         {
56             if (richTextBox1.Text == string.Empty)
57             {
58                 MessageBox.Show("编辑文本文件内容禁止为空!", "提示信息");
59                 return;
60             }
61             else
62             {
63                 if (TypeW == 1)
64                 {
65   FileStream fs = new FileStream(textBox1.Text+@"\\new.txt",FileMode.Create,FileAccess.ReadWrite);
66                     StreamWriter sw = new StreamWriter(fs,Encoding.Default);
67                     sw.Write(richTextBox1.Text);
68                     TypeW = 0;
69         MessageBox.Show("已经成功的将文本文件写入" + textBox1.Text + "\\new.txt之中", "提示信息");
70         //注意:此处顺序绝不可调换,为什么?【另外,为什么必须关闭线程资源?】
71                     sw.Close();
72                     fs.Close();
73                 }
74                 else if(TypeW==2)
75                 {
76   FileStream fs = new FileStream(textBox2.Text, FileMode.OpenOrCreate, FileAccess.ReadWrite);
77                     StreamWriter sw = new StreamWriter(fs, Encoding.Default);
78                     sw.Write(richTextBox1.Text);
79                     TypeW = 0;
80         MessageBox.Show("已经成功的将文本文件写入" + textBox2.Text + "之中", "提示信息");
81                     //注意:此处顺序绝不可调换,为什么?
82                     sw.Close();
83                     fs.Close();
84                 }
85             }
86         }
87     }
88 }
4 读取二进制
| FileStream filestream = new FileStream(Filename, FileMode.Create); BinaryWriter objBinaryWriter = new BinaryWriter(filestream); | 
常用方法:
| 方法 | 说明 | 
| Close() | 关闭当前阅读器及基础流。 | 
| Read() | 已重载。 从基础流中读取字符,并提升流的当前位置。 | 
| ReadDecimal() | 从当前流中读取十进制数值,并将该流的当前位置提升十六个字节。 | 
| ReadByte() | 从当前流中读取下一个字节,并使流的当前位置提升1个字节。 | 
| ReadInt16() | 从当前流中读取2字节有符号整数,并使流的当前位置提升2个字节。 | 
| ReadInt32() | 从当前流中读取4字节有符号整数,并使流的当前位置提升4个字节。 | 
| ReadString() | 从当前流中读取一个字符串。字符串有长度前缀,一次7位地被编码为整数。 | 
实例:建立一个BinaryReader类的一些主要方法

 1 using System;
 2 using System.IO;
 3  
 4 class BinaryRW
 5 {
 6     static void Main()
 7     {
 8         int i = 0;
 9         char[] invalidPathChars = Path.InvalidPathChars;
10         MemoryStream memStream = new MemoryStream();
11         BinaryWriter binWriter = new BinaryWriter(memStream);
12         // 写入内存
13         binWriter.Write("Invalid file path characters are: ");
14         for (i = 0; i < invalidPathChars.Length; i++)
15         {
16             binWriter.Write(invalidPathChars[i]);
17         }
18         // 用作生成编写器的内存流同样作为生成读取器的内存流
19         BinaryReader binReader = new BinaryReader(memStream);
20         // 设置流的起点
21         memStream.Position = 0;
22         // 从内存中读取数据,并把数据写入控制台
23         Console.Write(binReader.ReadString());
24         char[] memoryData = new char[memStream.Length - memStream.Position];
25         for (i = 0; i < memoryData.Length; i++)
26         {
27             memoryData[i] = Convert.ToChar(binReader.Read());
28         }
29         Console.WriteLine(memoryData);
30     }
31 }
类BinaryWriter以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
| 方法 | 说明 | 
| Close() | 关闭当前的 BinaryWriter 和基础流。 | 
| Flush() | 清理当前编写器的所有缓冲区,使所有缓冲数据写入基础设备。 | 
| Write() | 已重载。 将值写入当前流。 | 
建立一个BinaryWriter类方法

 1 using System;
 2 using System.IO;
 3  
 4 class BinaryRW
 5 {
 6     static void Main()
 7     {
 8         using (BinaryWriter binWriter = new BinaryWriter(File.Open(fileName, FileMode.Create)))
 9         {
10             binWriter.Write(aspectRatio);
11             binWriter.Write(lookupDir);
12             binWriter.Write(autoSaveTime);
13             binWriter.Write(showStatusBar);
14         }
15     }
16 }
4.2 写二进制文件
从工具箱之中拖拽MainMenu控件、SaveFileDialog控件、GroupBox控件、PictureBox控件各一个到Form窗体上;Form窗体的text属性设置为“图片处理器”;GroupBox控件的text属性设置为“图片显示区”;PictureBox控件的sizemode属性设置为zoom;MainMenu控件添加菜单项及子项:
| 菜单项 | 子项 | 其他属性 | 
| 图片(&P) | 打开图片(&O) | 快捷键等其他属性根据自己设计定(下同) | 
| 复制图片(&C) |  | |
| 关闭(&Q) |  |  | 


  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Text;
  7 using System.Windows.Forms;
  8 using System.IO;
  9  
 10 namespace FileOptionApplication
 11 {
 12     public partial class Form12 : Form
 13     {
 14         public Form12()
 15         {
 16             InitializeComponent();
 17         }
 18         /// <summary>
 19         /*******************************************************
 20         **方 法  名:GetFileBytes
 21         **输 入参数:Filename:文件名称;
 22         **输 出参数:比特流类型
 23         **返 回  值:byte[]二进制流
 24         **创 建  人:钱哨
 25         **创 建日期:09-7-9
 26         **描     述:将读取的文件转化成为二进制流。
 27         *******************************************************/
 28         /// <summary>
 29         /// </summary>
 30         /// <param name="Filename">打开的图片具体路径及文件名称</param>
 31         /// <returns>比特流类型</returns>
 32         public byte[] GetFileBytes(string Filename)
 33         {
 34             if (Filename == "")
 35                 return null;
 36             try
 37             {
 38                 FileStream fileStream = new FileStream(Filename, FileMode.Open, FileAccess.Read);
 39                 BinaryReader binaryReader = new BinaryReader(fileStream);
 40                 byte[] fileBytes = binaryReader.ReadBytes((int)fileStream.Length);
 41                 binaryReader.Close();
 42                 fileStream.Close();
 43                 return fileBytes;
 44             }
 45             catch
 46             {
 47                 return null;
 48             }
 49         }
 50         /*******************************************************
 51         **方 法  名:WriteFileBytes
 52         **输 入参数:TargetFilename:目标文件名称;
 53         **输 出参数:布尔类型:是否写成功
 54         **返 回  值:byte[]二进制流
 55         **创 建  人:钱哨
 56         **创 建日期:09-7-9
 57         **描     述:将读取的文件转化成为二进制流。       
 58         *******************************************************/
 59         /// </summary>
 60         /// <param name="TargetFilename">目标文件</param>
 61         /// <param name="fileBytes">文件比特流</param>
 62         /// <returns>布尔类型:是否写成功</returns>
 63         public bool WriteFileBytes(string TargetFilename, byte[] fileBytes)
 64         {
 65             bool k = true;
 66             if (TargetFilename != "" && fileBytes.Length != 0)
 67             {
 68                 try
 69                 {
 70    FileStream fileStream = new FileStream(TargetFilename, FileMode.OpenOrCreate, FileAccess.Write);
 71                     BinaryWriter binaryWriter = new BinaryWriter(fileStream);
 72                     binaryWriter.Write(fileBytes);
 73                     binaryWriter.Flush();
 74                     binaryWriter.Close();
 75                     fileStream.Close();
 76                 }
 77                 catch
 78                 {
 79                     k = false;
 80                 }
 81             }
 82             else
 83             {
 84                 k = false;
 85             }
 86             return k;
 87         }
 88         /// <summary>
 89         /// 菜单:打开图片
 90         /// </summary>
 91         private void toolStripMenuItem3_Click(object sender, EventArgs e)
 92         {
 93             try
 94             {
 95                 OpenFileDialog openfile = new OpenFileDialog();
 96                 openfile.Filter = "jpg类型图片(*.jpg)|*.jpg|BMP类型图片(*.bmp)|*.bmp";
 97                 if (openfile.ShowDialog() == DialogResult.OK)
 98                 {
 99                     byte[] picbinary = GetFileBytes(openfile.FileName);
100                     //第一步:打开图片文件,获得比特流
101                     MemoryStream mempicstream = new MemoryStream(picbinary);
102                    //第二步:将比特流还存在内存工作流中。
103                     pictureBox1.Image = Image.FromStream(mempicstream);
104                    //第三步:加载内存流到图片控件
105                     mempicstream.Dispose();
106                     mempicstream.Close();
107                 }
108             }
109             catch (Exception m)
110             {
111                 MessageBox.Show("读取图片出错,可能的问题是:"+Convert.ToString(m) ,"错误提示");
112             }
113         }
114         /// <summary>
115         /// 将打开的图片进行复制
116         /// </summary>
117         private void toolStripMenuItem4_Click(object sender, EventArgs e)
118         {
119             try
120             {
121                 if (pictureBox1.Image == null)
122                 {
123                     MessageBox.Show("禁止图片为空时候另存信息。", "错误提示");
124                 }
125                 else
126                 {
127                     saveFileDialog1.Filter = "jpg类型图片(*.jpg)|*.jpg";
128                     DialogResult result = saveFileDialog1.ShowDialog();
129                     if (result == DialogResult.OK)
130                     {
131                         MemoryStream ms=new MemoryStream();
132                         Bitmap bm = new Bitmap(pictureBox1.Image);
133                         bm.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
134                         byte[] bytes = ms.ToArray();
135                         WriteFileBytes(saveFileDialog1.FileName, bytes);
136                         MessageBox.Show("另存图片成功", "提示");
137                         ms.Dispose();
138                         ms.Close();
139                         bm.Dispose();
140                     }
141                 }
142             }
143             catch (Exception m)
144             {
145                MessageBox.Show("读取图片出错,可能的问题是:" + Convert.ToString(m), "错误提示");
146             }
147         }
148     }
149 }
成功
3.5读写内存流
5-1 读写内存流 ——MemoryStream类
| 名称 | 说明 | 
| MemoryStream () | 使用初始化为零的可扩展容量初始化 MemoryStream 类的新实例。 | 
| MemoryStream (byte[]) | 基于指定的字节数组初始化 MemoryStream 类的无法调整大小的新实例。 | 
| MemoryStream (byte[], Boolean) | 使用按指定要求设置的 CanWrite 属性基于指定的字节数组初始化 MemoryStream 类的无法调整大小的新实例。 | 
| MemoryStream mem = new MemoryStream(buffer); //这时,无法再设置Capacity属性的大小。 | 
| MemoryStream mem = new MemoryStream(buffer, false); //这时,CanWrite属性就被设置为false 。 | 
案例学习:MemoryStream类案例
从工具箱之中拖拽五个Label控件到Form窗体上,拖拽一个Button控件。

eg.

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.IO;
 9  
10 namespace FileOptionApplication
11 {
12     public partial class Form14 : Form
13     {
14         public Form14()
15         {
16             InitializeComponent();
17         }
18         //建立字节数组
19         byte[] buffer = new byte[600];
20         /// <summary>
21         /// 获取测试性数据
22         /// </summary>
23         private void GetTestData()
24         {
25             for (int i = 0; i < 600; i++)
26             {
27                 buffer[i] = (byte)(i % 256);
28                 //byte类型的数最大不能超过255,用256取模实现
29             }
30         }
31         /// <summary>
32         /// button1按钮的鼠标单击Click事件
33         /// </summary>
34         private void button1_Click(object sender, EventArgs e)
35         {
36             //创建测试数据
37             GetTestData();
38             //创建内存流对象,初始分配50字节的缓冲区
39             MemoryStream mem = new MemoryStream(50);
40             //向内存流中写入字节数组的所有数据
41             mem.Write(buffer,0,buffer.GetLength(0));
42             //使用从缓冲区读取的数据将字节块写入当前流。
43             //参数:
44             //1、buffer从中写入数据的缓冲区。
45             //2、offset buffer中的字节偏移量,从此处开始写入。
46             //3、count最多写入的字节数。
47             //GetLength(0) 为 GetLength 的一个示例,它返回 Array 的第一维中的元素个数。
48             label1.Text = "写入数据后的内存流长度是:"+mem.Length.ToString();
49             label2.Text = "分配给内存流的缓冲区大小:"+mem.Capacity.ToString();
50             mem.SetLength(500);
51             label3.Text = "调用SetLength方法后的内存流长度:" + mem.Length.ToString();
52             mem.Capacity = 620;//注意:此值不能小于Length属性
53             label4.Text = "调用Capacity方法后缓冲区大小:" + mem.Capacity.ToString();
54             //将读写指针移到距流开头10个字节的位置
55             mem.Seek(45, SeekOrigin.Begin);
56             label5.Text = "内存中的信息是:"+mem.ReadByte().ToString();
57         }
58     }
59 }

5-3 读写缓存流 ——BufferedStream类
| 名称 | 说明 | 
| 使用默认的缓冲区大小 4096 字节初始化 BufferedStream 类的新实例。 | |
| 使用指定的缓冲区大小初始化 BufferedStream 类的新实例。 | 
BufferedStream类案例学习
1. 案例学习:通过缓冲区交换数据
从工具箱之中拖拽一个GroupBox,text属性设置为“打开文件”;拖拽二个Label控件到GroupBox上,text属性分别设置为“请选择源文件名:”、“请填写备份文件名:”;拖拽二个TextBox控件到GroupBox上,其中第一TextBox控件的Enabled属性为false;拖拽二个Button控件到GroupBox上,text属性分别设置为“打开文件”、“备份文件”。


 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.IO;
 9  
10 namespace FileOptionApplication
11 {
12     public partial class Form16 : Form
13     {
14         public Form16()
15         {
16             InitializeComponent();
17         }
18         /// <summary>
19         /// 打开原始文件
20         /// </summary>
21         private void button1_Click(object sender, EventArgs e)
22         {
23             OpenFileDialog openfile = new OpenFileDialog();
24             openfile.Filter = "文本文件(*.txt)|*.txt";
25             if (openfile.ShowDialog() == DialogResult.OK)
26             {
27                 textBox1.Text = openfile.FileName.ToString();
28             }
29         }
30         /// <summary>
31         /// 备份目标文件;Stream 和 BufferedStream 的实例
32         /// </summary>
33         private void button2_Click(object sender, EventArgs e)
34         {
35             string targetpath = @"c:\" + textBox2.Text + ".txt";
36             FileStream fs =File.Create(targetpath);
37             fs.Dispose();
38             fs.Close();
39             string sourcepath = textBox1.Text;
40             Stream outputStream= File.OpenWrite(targetpath);
41             Stream inputStream = File.OpenRead(sourcepath);
42             BufferedStream bufferedInput = new BufferedStream(inputStream);
43             BufferedStream bufferedOutput = new BufferedStream(outputStream);
44             byte[] buffer = new Byte[4096];
45             int bytesRead;
46             while ((bytesRead =bufferedInput.Read(buffer, 0,4096)) > 0)
47             {
48                 bufferedOutput.Write(buffer, 0, bytesRead);
49             }
50             //通过缓冲区进行读写
51             MessageBox.Show("给定备份的文件已创建", "提示");
52             bufferedOutput.Flush();
53             bufferedInput.Close();
54             bufferedOutput.Close();
55             //刷新并关闭 BufferStream
56         }
57     }
58 }
文件流FileStream 上机实验
文本编辑器
mainMenu TextBox OpenFileDialog SaveFileDialog FontDialog colorDialog
代碼

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Text;
  7 using System.Windows.Forms;
  8 using System.IO;
  9  
 10 namespace FileOptionApplication
 11 {
 12     public partial class Form16 : Form
 13     {
 14         public Form16()
 15         {
 16             InitializeComponent();
 17         }
 18         /// <summary>
 19         /// 打开原始文件
 20         /// </summary>
 21         private void button1_Click(object sender, EventArgs e)
 22         {
 23             OpenFileDialog openfile = new OpenFileDialog();
 24             openfile.Filter = "文本文件(*.txt)|*.txt";
 25             if (openfile.ShowDialog() == DialogResult.OK)
 26             {
 27                 textBox1.Text = openfile.FileName.ToString();
 28             }
 29         }
 30         /// <summary>
 31         /// 备份目标文件;Stream 和 BufferedStream 的实例
 32         /// </summary>
 33         private void button2_Click(object sender, EventArgs e)
 34         {
 35             string targetpath = @"c:\" + textBox2.Text + ".txt";
 36             FileStream fs =File.Create(targetpath);
 37             fs.Dispose();
 38             fs.Close();
 39             string sourcepath = textBox1.Text;
 40             Stream outputStream= File.OpenWrite(targetpath);
 41             Stream inputStream = File.OpenRead(sourcepath);
 42             BufferedStream bufferedInput = new BufferedStream(inputStream);
 43             BufferedStream bufferedOutput = new BufferedStream(outputStream);
 44             byte[] buffer = new Byte[4096];
 45             int bytesRead;
 46             while ((bytesRead =bufferedInput.Read(buffer, 0,4096)) > 0)
 47             {
 48                 bufferedOutput.Write(buffer, 0, bytesRead);
 49             }
 50             //通过缓冲区进行读写
 51             MessageBox.Show("给定备份的文件已创建", "提示");
 52             bufferedOutput.Flush();
 53             bufferedInput.Close();
 54             bufferedOutput.Close();
 55             //刷新并关闭 BufferStream
 56         }
 57     }
 58 }
 59 
 60 
 61 ————————————————————————————————
 62 using System;
 63 using System.Collections.Generic;
 64 using System.ComponentModel;
 65 using System.Data;
 66 using System.Drawing;
 67 using System.Text;
 68 using System.Windows.Forms;
 69 
 70 namespace WindowsApplication1
 71 {
 72     public partial class Form9 : Form
 73     {
 74         public Form8 mainForm;
 75         public Form9()
 76         {
 77             InitializeComponent();
 78         }
 79         /// <summary>
 80         /// 点击查询下一个后
 81         /// </summary>
 82         /// <param name="sender"></param>
 83         /// <param name="e"></param>
 84         private void btnFindNext_Click(object sender, EventArgs e)
 85         {
 86             mainForm.findKey = txtContent.Text;
 87             mainForm.isToDown = radToDown.Checked;
 88             mainForm.mathingStyle = checkBox1.Checked;
 89             string source;   //被查找的文本
 90             string finding;  //查找的关键字
 91 
 92             //当不区分大小写时,将内容都转换为小写
 93             if (this.checkBox1.Checked == false)
 94             {
 95                 source = this.mainForm.textBox1.Text.ToLower();
 96                 finding = this.txtContent.Text.ToLower();
 97             }
 98             else
 99             {
100                 source = this.mainForm.textBox1.Text;
101                 finding = this.txtContent.Text;
102             }
103 
104             //向下查找
105             if (this.radToDown.Checked)
106             {
107                 //SelectionStart能获取光标起始点
108                 int temp = source.IndexOf(finding, mainForm.textBox1.SelectionStart + mainForm.textBox1.SelectedText.Length);
109                 if (temp >= 0)
110                 {
111                     this.mainForm.textBox1.Select(temp, finding.Length);
112                     mainForm.textBox1.ScrollToCaret();//当屏幕显示不了时,实现滚动
113                     this.mainForm.Focus();
114                 }
115                 else
116                 {
117                     MessageBox.Show("没有找到" + "'" + txtContent.Text + "'");
118                 }
119             }
120             //向上查找
121             else
122             {
123                 int temp = -1;
124                 try
125                 {
126                     temp = source.LastIndexOf(finding, mainForm.textBox1.SelectionStart - 1);
127                 }
128                 catch { }
129                 if (temp >= 0)
130                 {
131                     this.mainForm.textBox1.Select(temp, finding.Length);
132                     mainForm.textBox1.ScrollToCaret();//当屏幕显示不了时,实现滚动
133                     this.mainForm.Focus();
134                 }
135                 else
136                 {
137                     MessageBox.Show("没有找到" + "'" + txtContent.Text + "'");
138                 }
139             }
140         }
141         /// <summary>
142         /// 点击取消后
143         /// </summary>
144         /// <param name="sender"></param>
145         /// <param name="e"></param>
146         private void btnCancel_Click(object sender, EventArgs e)
147         {
148             this.Close();
149         }
150         /// <summary>
151         /// 当查询文本框文本内容发生变化后
152         /// </summary>
153         /// <param name="sender"></param>
154         /// <param name="e"></param>
155         private void txtContent_TextChanged(object sender, EventArgs e)
156         {
157             if (txtContent.Text.Length > 0)
158             {
159                 btnFindNext.Enabled = true;
160             }
161             else
162             {
163                 btnFindNext.Enabled = false;
164             }
165         }
166         /// <summary>
167         /// 表单初始化事件 
168         /// </summary>
169         /// <param name="sender"></param>
170         /// <param name="e"></param>
171         private void Form9_Load(object sender, EventArgs e)
172         {
173             txtContent.Text = mainForm.textBox1.SelectedText;
174         }
175 
176     }
177 }
178 —————————————————————————————————
179 
180 using System;
181 using System.Collections.Generic;
182 using System.ComponentModel;
183 using System.Data;
184 using System.Drawing;
185 using System.Text;
186 using System.Windows.Forms;
187 
188 namespace WindowsApplication1
189 {
190     public partial class Form10 : Form
191     {
192         public Form8 mainForm;
193         public Form10()
194         {
195             InitializeComponent();
196         }
197         /// <summary>
198         /// 取消
199         /// </summary>
200         /// <param name="sender"></param>
201         /// <param name="e"></param>
202         private void btnCancel_Click(object sender, EventArgs e)
203         {
204             this.Close();
205         }
206         /// <summary>
207         /// 查找下一个
208         /// </summary>
209         /// <param name="sender"></param>
210         /// <param name="e"></param>
211         private void btnFindNext_Click(object sender, EventArgs e)
212         {
213             string source;
214             string finding;
215             if (this.checkBox1.Checked == false)
216             {
217                 source = this.mainForm.textBox1.Text.ToLower();
218                 finding = this.txtFindContent.Text.ToLower();
219             }
220             else
221             {
222                 source = this.mainForm.textBox1.Text;
223                 finding = this.txtFindContent.Text;
224             }
225 
226             int temp = source.IndexOf(finding, mainForm.textBox1.SelectionStart + mainForm.textBox1.SelectedText.Length);
227             if (temp >= 0)
228             {
229                 this.mainForm.textBox1.Select(temp, finding.Length);
230                 mainForm.textBox1.ScrollToCaret();
231                 this.mainForm.Focus();
232             }
233             else
234             {
235                 MessageBox.Show("没有找到" + "'" + txtFindContent.Text + "'");
236             }
237         }
238         /// <summary>
239         /// 替换
240         /// </summary>
241         /// <param name="sender"></param>
242         /// <param name="e"></param>
243         private void btnReplace_Click(object sender, EventArgs e)
244         {
245             if (txtFindContent.Text == mainForm.textBox1.SelectedText)
246             {
247                 mainForm.textBox1.SelectedText = txtReplace.Text;
248             }
249             else
250             {
251                 btnFindNext.PerformClick();
252             }
253         }
254         /// <summary>
255         /// 全部替换
256         /// </summary>
257         /// <param name="sender"></param>
258         /// <param name="e"></param>
259         private void btnReplaceAll_Click(object sender, EventArgs e)
260         {
261             int count = 0;
262             int position;
263             string source;
264             string finding;
265             while (true)
266             {
267                 //下面为查找代码
268                 if (this.checkBox1.Checked == false)
269                 {
270                     source = this.mainForm.textBox1.Text.ToLower();
271                     finding = this.txtFindContent.Text.ToLower();
272                 }
273                 else
274                 {
275                     source = this.mainForm.textBox1.Text;
276                     finding = this.txtFindContent.Text;
277                 }
278 
279                 if (count == 0)
280                 {
281                     position = source.IndexOf(finding, 0);
282                 }
283                 else
284                 {
285                     position = source.IndexOf(finding, mainForm.textBox1.SelectionStart + mainForm.textBox1.SelectedText.Length);
286                 }
287 
288                 if (position >= 0)
289                 {
290                     this.mainForm.textBox1.Select(position, finding.Length);
291                     mainForm.textBox1.ScrollToCaret();
292                     this.mainForm.Focus();
293                     count++;
294                 }
295 
296 
297                 //下面为替换代码
298                 if (mainForm.textBox1.SelectedText.Length > 0)
299                 {
300                     btnReplace.PerformClick();
301                 }
302                 else
303                 {
304                     break;
305                 }
306             }
307             MessageBox.Show("替换了" + count + "个地方");
308         }
309         /// <summary>
310         /// 表单初始化
311         /// </summary>
312         /// <param name="sender"></param>
313         /// <param name="e"></param>
314         private void Form10_Load(object sender, EventArgs e)
315         {
316             txtFindContent.Text = mainForm.textBox1.SelectedText;
317         }
318     }
319 }
二进制和内存流文件操作上机实验
往数据库放图片
school Myphoto
Pid id 自动增长类型 主码
Photo Image

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Data.SqlClient;
  6 using System.Drawing;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.IO;
 10 
 11 namespace WindowsApplication1
 12 {
 13     public partial class Form13 : Form
 14     {
 15         public Form13()
 16         {
 17             InitializeComponent();
 18         }
 19 
 20         SqlConnection connection;
 21         /// <summary>
 22         /// 打开数据库
 23         /// </summary>
 24         private void open()
 25         {
 26             string connstring = "Data Source=(local);Initial Catalog=school;User ID=sa";
 27             connection = new SqlConnection(connstring);
 28             connection.Open();
 29         }
 30         /// <summary>
 31         /// 关闭数据库
 32         /// </summary>
 33         private void close()
 34         {
 35             connection.Dispose();
 36             connection.Close();
 37             connection = null;
 38         }
 39         
 40         /// <summary>
 41         /// 输入SQL命令,得到DataReader对象
 42         /// </summary>
 43         public SqlDataReader GetDataReader(string sqlstring)
 44         {
 45             open();
 46             SqlCommand mycom = new SqlCommand(sqlstring, connection);
 47             SqlDataAdapter adapter = new SqlDataAdapter();
 48             adapter.SelectCommand = mycom;
 49             SqlDataReader Dr = mycom.ExecuteReader();
 50             return Dr;
 51 
 52         }
 53 
 54         /// <summary>
 55         /*******************************************************
 56         **方 法  名:GetFileBytes
 57         **输 入参数:Filename:文件名称;
 58         **        
 59         **输 出参数:
 60         **返 回  值:byte[]二进制流
 61         **创 建  人:钱哨
 62         **创 建日期:08-7-9
 63         **描     述:将读取的文件转化成为二进制流。
 64         *******************************************************/
 65         /// <summary>
 66         /// </summary>
 67         /// <param name="Filename">打开的图片具体路径及文件名称</param>
 68         /// <returns>比特流类型</returns>
 69         public byte[] GetFileBytes(string Filename)
 70         {
 71             if (Filename == "")
 72                 return null;
 73             try
 74             {
 75                 FileStream fileStream = new FileStream(Filename, FileMode.Open, FileAccess.Read);
 76                 BinaryReader binaryReader = new BinaryReader(fileStream);
 77 
 78                 byte[] fileBytes = binaryReader.ReadBytes((int)fileStream.Length);
 79                 binaryReader.Close();
 80                 fileStream.Close();
 81 
 82                 return fileBytes;
 83             }
 84             catch
 85             {
 86                 return null;
 87             }
 88         }
 89         /// <summary>
 90         /// 加载并刷新当前的combobox对象控件
 91         /// </summary>
 92         private void loadcombobox()
 93         {
 94             comboBox1.Items.Clear();
 95             SqlDataReader dr = GetDataReader("select * from Myphoto");
 96             while (dr.Read())
 97             {
 98                 comboBox1.Items.Add(dr[0].ToString());
 99             }
100             close();
101         }
102 
103         /// <summary>
104         /// 初始化事件,加载combobox对象控件的列表信息
105         /// </summary>
106         /// <param name="sender"></param>
107         /// <param name="e"></param>
108         private void Form13_Load(object sender, EventArgs e)
109         {
110             loadcombobox();
111         }
112 
113         /// <summary>
114         /// 打开图片
115         /// </summary>
116         /// <param name="sender"></param>
117         /// <param name="e"></param>
118         private void button1_Click(object sender, EventArgs e)
119         {
120             try
121             {
122                 OpenFileDialog openfile = new OpenFileDialog();
123                 openfile.Filter = "jpg类型图片(*.jpg)|*.jpg|BMP类型图片(*.bmp)|*.bmp";
124                 if (openfile.ShowDialog() == DialogResult.OK)
125                 {
126                     byte[] picbinary = GetFileBytes(openfile.FileName);//第一步:打开图片文件,获得比特流
127                     MemoryStream mempicstream = new MemoryStream(picbinary);//第二步:将比特流还存在内存工作流中。
128                     pictureBox1.Image = Image.FromStream(mempicstream);//第三步:加载内存流到图片控件
129                     textBox1.Text = openfile.FileName.ToString();
130                     mempicstream.Dispose();
131                     mempicstream.Close();
132                 }
133             }
134             catch (Exception m)
135             {
136                 MessageBox.Show("读取图片出错,可能的问题是:" + Convert.ToString(m), "错误提示");
137             }
138         }
139         
140         
141 
142         private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
143         {
144             if (comboBox1.SelectedIndex > -1)
145             {
146                 string sqlstring = string.Format("select photo from Myphoto where pid="+comboBox1.Text);
147                 SqlDataReader dr = GetDataReader(sqlstring);
148                 if (dr.Read())
149                 {
150                     byte[] b = (byte[])dr["photo"];
151                     MemoryStream ms = new MemoryStream(b);
152                     //Image img = Image.FromStream(ms);
153                     Image imge = new Bitmap(ms);
154                     pictureBox1.Image = imge;
155                 }
156             }
157         }
158         /// <summary>
159         /// 将打开的文件保存到数据库之中
160         /// </summary>
161         /// <param name="sender"></param>
162         /// <param name="e"></param>
163         private void button2_Click(object sender, EventArgs e)
164         {
165             try
166             {
167                 if (pictureBox1.Image == null)
168                 {
169                     MessageBox.Show("禁止图片为空时候存储信息。", "错误提示");
170                 }
171                 else
172                 {
173 
174                     MemoryStream ms = new MemoryStream();
175                     Bitmap bm = new Bitmap(pictureBox1.Image);
176                     bm.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
177                     byte[] bytes = ms.ToArray();
178                     //开始向数据库写信息
179                     string insert = "INSERT INTO Myphoto(Photo) VALUES (@Photo)";
180                     //sql命令参数
181                     open();
182                     SqlCommand sqlCommand = new SqlCommand(insert, connection);
183                     //此句特别重要:指定SQL操作的参数性质!
184                     sqlCommand.Parameters.Add("@Photo", SqlDbType.Binary).Value = bytes;
185 
186                     sqlCommand.ExecuteNonQuery();
187                     close();
188 
189                     MessageBox.Show("另存图片成功", "提示");
190                                         
191                     ms.Dispose();
192                     ms.Close();
193                     bm.Dispose();
194                     loadcombobox();
195                 }
196 
197             }
198             catch (Exception m)
199             {
200                 MessageBox.Show("读取图片出错,可能的问题是:" + Convert.ToString(m), "错误提示");
201             }
202         }
203 
204         
205     }
206 }
来源:https://www.cnblogs.com/zhenqk/p/11101435.html
