@TOC
前言
搞编程的,在工作中学习中,文件及文件流操作很常见,每次需要手动关闭流,何不封装一下呢,与诸君共勉。
一、处理文件的通用函数UniversalFileProcess()
1.处理文件的通用函数UniversalFileProcess(),只要传入文件路径和处理文件的具体代码,这个方法就会自动完成异常处理和关闭文件的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public static void UniversalFileProcess(string path, MyFileProcessCode doSomething) { FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
try { doSomething(fileStream); } catch (Exception e) { Console.WriteLine(e.Message); } finally { if(fileStream != null) { fileStream.Close(); } } }
|
2.但是想要以函数为参数必须使用委托机制
1 2 3 4
| //但是想要以函数为参数必须使用委托机制。 //定义一个名为MyFileProcessCode(FileStream file)的委托。 public delegate void MyFileProcessCode(FileStream file);
|
3.处理文件的具体代码
1 2 3 4 5
| //处理文件的具体代码 public static void DoSomething(FileStream fileStream){ byte[] datas = {100, 101, 102, 103, 104, 105}; fileStream.Write(datas, 0, datas.Length); }
|
4.使用工具类的例子,模拟一下咱们如何使用
1 2 3 4 5 6
| //使用工具类的例子 public static void Main(string[] args){ //今后咱们处理文件时,只需要把处理文件的具体代码写在一个函数中,然后调用UniversalFileProcess()函数,即可使用 //而不用关心异常处理和关闭文件的操作 UniversalFileProcess(@"C:/a.txt", new MyFileProcessCode(DoSomething)); }
|
二、两个注意事项:
1.继续优化,可以通过匿名函数省区每次都要编写DoSomeThing()函数这一步。【其中形参中的delegate开始是一个匿名函数,封装了处理文件的具体代码】
1 2 3 4 5 6 7 8 9
| //继续优化,可以通过匿名函数省区每次都要编写DoSomeThing()函数这一步 static void Main(string[] args) { UniversalFileProcess(@"C:/a.txt", delegate(FileStream fileStream)) { byte[] datas = {100, 101, 102, 103, 104, 105}; fileStream.Write(datas, 0, datas.Length); } }
|
2.二、除了用finally,还可以用using关闭文件流
- 在using后的括号中创建了一个流对象fileStream,然后using的语句块中使用流对象fileStream,当退出using时系统会自动关闭流对象fileStream
1 2 3 4 5 6 7
| //在using后的括号中创建了一个流对象fileStream,然后using的语句块中使用流对象fileStream,当退出using时系统会自动关闭流对象fileStream using(FileStream fileStream = File.OpenText[path]) { byte[] datas = {100, 101, 102, 103, 104, 105}; fileStream.Write(datas, 0, datas.Length); } }
|
- using的一般使用形式是:在using后的括号中创建了一个对象obj,然后using的语句块中使用对象obj,当退出using时系统会自动关闭对象obj
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| //using的一般使用形式是:在using后的括号中创建了一个对象obj,然后using的语句块中使用对象obj,当退出using时系统会自动关闭对象obj using(type onj = initialization) { //具体代码 } //using等价写法 { type obj = initialization; try { //具体处理代码 } finally { if(obj != null) { //调用obj对象的Dispose()方法销毁对象释放资源 ((IDisposable)obj).Dispose(); } } }
|
巨人的肩膀