c#文件和流的相关处理

文件操作第一步:引用指令集

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);
});
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值