设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 317|回复: 3
打印 上一主题 下一主题

asp. net下使用foreach简化文本文件的访问。

[复制链接]
跳转到指定楼层
1#
发表于 2009-3-16 23:10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多时候,我们总是按照行的方式访问文本文件,使用foreach语句能够极大地简化访问逻辑:例如:  
foreach (string line in new LineReader(”c:\abc.txt”))  
  Console.WriteLine(line);  
完整代码如下:  
using System;  
using System.IO;  
using System.Text;  
using System.Collections;  
namespace Forks.Utils.IO  
{  
    public struct LineReader : IDisposable  
    {  
    public LineReader(string file, Encoding encoding) : this(file, encoding, false)  
        {  

    }  
    public LineReader(string file, Encoding encoding, bool ignoreBlankLines) : this(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read), encoding, ignoreBlankLines)  
    {  
    }  
    public LineReader(Stream stream, Encoding encoding) : this(stream, encoding, false)  
    {  
    }  
    public LineReader(Stream stream, Encoding encoding, bool ignoreBlankLines) : this(new StreamReader(stream, encoding), ignoreBlankLines)  
    {  
    }  
    public LineReader(TextReader reader) : this(reader, false)  
    {  
    }  
    TextReader mReader;  
    bool mIgnoreBlankLines;  
    public LineReader(TextReader reader, bool ignoreBlankLines)  
    {  
      mReader = reader;  
      mIgnoreBlankLines = ignoreBlankLines;  
      mCurrent = null;  
    }  
    public LineReader GetEnumerator()  
    {  
      return this;  
    }  
    public void Reset()  
    {  
      throw new NotSupportedException("LineReader???ü?áè?ò?′?");  
    }  
    string mCurrent;  
    public string Current  
    {  
      get  
      {  
        return mCurrent;  
      }  
    }  
    public bool MoveNext()  
    {  
      do  
      {  
        mCurrent = mReader.ReadLine();  
      }while (mIgnoreBlankLines && mCurrent != null && mCurrent.Length == 0);  
      return mCurrent != null;  
    }  
    public void Dispose()  
    {  
      mReader.Close();  
    }  
  }  
}  
测试代码:  
using System;  
using System.IO;  
using System.Text;  
using NUnit.Framework;  
using Forks.Test;  
namespace Forks.Utils.IO  
{  
  [TestFixture]  
    public class LineReaderTest  
    {  
    const string TestLines = @"abc asd ewr afa e   
  start with blanks  
end with blanks     
oo×?abc123!@#  
end of text!";  
    [Test]  
    public void ReadFromReader()  
    {  
      doTest(new LineReader(new StringReader(TestLines)));  
    }  
    [Test]  
    public void ReadFromFile()  
    {  
      string file = Path.GetTempFileName();  
      try  
      {  
        StringUtil.SaveToFile(TestLines, file, Encoding.GetEncoding("gb2312"));  
        doTest(new LineReader(file, Encoding.GetEncoding("gb2312")));  
      }  
      finally  
      {  
        FileUtil.SafeDelete(file);  
      }  
    }  
    [Test]  
    public void ReadFromStream()  
    {  
      string file = Path.GetTempFileName();  
      try  
      {  
        StringUtil.SaveToFile(TestLines, file, Encoding.GetEncoding("gb2312"));  
        using (Stream stream = new FileStream(file, FileMode.Open))  
          doTest(new LineReader(stream, Encoding.GetEncoding("gb2312")));  
      }  
      finally  
      {  
        FileUtil.SafeDelete(file);  
      }  
    }  
    void doTest(LineReader reader)  
    {  
      StringBuilder sb = new StringBuilder();  
      foreach (string line in reader)  
        sb.Append(line + Environment.NewLine);  
      Assert.AreEqual(TestLines + Environment.NewLine, sb.ToString());  
    }  
    [Test]  
    public void IgnoreBlankLine()  
    {  
      foreach (string line in new LineReader(new StringReader(TestLines), true))  
        Assert.IsTrue(line.Length != 0);  
    }  
    }  
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 16:43 , Processed in 0.079949 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表