@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
	/// <summary>
/// 处理文件的通用函数UniversalFileProcess(),只要传入文件路径和处理文件的具体代码,这个方法就会自动完成异常处理和关闭文件的操作
/// </summary>
/// <param name="path"></param>
/// <param name="doSmoething" ></param> 把处理文件的具体代码封装在doSomething()函数中
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)
{
//Close()方法就是通过调用Dispose()方法实现的
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();
        }
    }
}


巨人的肩膀