文件操作第一步:引用指令集
using System.IO;
1.File/FileInfo示例
try
{
string path = @"D:\test.txt";
if (File.Exists(path))
{
string contents = File.ReadAllText(path);
Console.WriteLine("Read:\n" + contents);
}
else
{
string contents = "新建的哈哈哈哈,\n 呵呵呵呵呵";
File.WriteAllText(path, contents);
Console.WriteLine("文件已写入.");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
2.Directory/DirectoryInfo示例
try
{
string path = @"D:\0000";
if (Directory.Exists(path))
{
string[] dirs = Directory.GetDirectories(path);
Console.WriteLine("子目录");
foreach (string dir in dirs)
{
Console.WriteLine(dir);
}
string[] files = Directory.GetFiles(path);
Console.WriteLine("文件:");
foreach (string file in files)
{
Console.WriteLine(file);
}
}
else
{
Console.WriteLine("目录不存在");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
3.文件流操作示例
string fileName = @"D:\filestream_test.data";
if (!File.Exists(fileName))
{
FileInfo myFile = new FileInfo(fileName);
FileStream fs = myFile.OpenWrite();
byte[] datas = { 100, 101, 102, 103 };
fs.Write(datas, 0, datas.Length);
Console.WriteLine("数据已写入");
fs.Close();
}
else
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
byte[] datas = new byte[fs.Length];
fs.Read(datas, 0, datas.Length);
Console.WriteLine("读取数据:");
foreach (byte date in datas)
{
Console.WriteLine(date);
}
fs.Close();
}
流操作之后必须关闭流,可以使用using语句(流操作完成后自动关闭流)
using(FileStream fs = File.OpenWrite(path))
{
byte[] datas = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 };
fs.Write(datas, 0, datas.Length);
}
此外,还可以通过 BinryReader 和 BinaryWriter 类实现二进制文件的读写
4.文件处理的封装
//处理文件的通用方法
public static void UniversalProcess(string path,MyFileProcessCode doSomething)
{
FileStream fs = new FileStream(path,FileMode.Open, FileAccess.ReadWrite);
try
{
//处理文件的具体代码
doSomething(fs);
}
catch (Exception e)
{
//异常处理
Console.WriteLine(e.Message);
}
finally
{
//关闭流
if (fs != null)
fs.Close();
}
}
上面我们编写了一个处理文件的通用方法UniversalProcess(),只要告诉它文件路径和处理文件的具体代码,它就会自动完成异常处理和关闭文件的操作。那么如何将处理文件
的具体代码传递给UniversalProcess()方法呢?我们的方法是把处理文件的具体代码封装在doSomething()方法中,然后把它传给UniversalProcess()。显然,要想实现以方法为参数,必须使用委托机制
我们先定义一个名为 MyFileProcessCode 的委托。
public delegate void MyFileProcessCode(FileStream file);
然后把事件的处理文件的具体代码写入方法 DoSomething()中。
//处理文件的具体代码
public static void DoSomething(FileStream fs)
{
byte[] datas = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 };
fs.Write(datas, 0, datas.Length);
}
最后把 DoSomething()方法转换为 MyFileProcessCode 委托,传给通用方法 Universal
Process()。
static void Main(string[] args)
{
//只需调用 UniversalProcess()方法即可
UniversalProcess(@"D:\a.text", new MyFileProcessCode(DoSomething));
}
今后我们处理文件时,只需要事先把处理文件的具体代码编写在一个方法中,然后调
用 UniversalProcess()就行了,而不用去关心异常处理和关闭文件的操作,UniversalProcess()
方法会自动帮我们完成。这种方法适合于频繁读写文件并且异常处理方法都相同的程序。
可能有读者 会 觉 得, 每 次 调用 UniversalProcess()方 法 前 都 要事 先 编 写一 个
DoSomething()方法也挺麻烦的,其实我们可以通过匿名方法省去这一步。
static void Main(string[] args)
{
UniversalProcess(@"D:\a.text", delegate(FileStream fs)
{
byte[] datas = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 };
fs.Write(datas, 0, datas.Length);
});
}