新微赢技术网

标题: asp. net下使用foreach简化文本文件的访问。 [打印本页]

作者: ‘為ㄋ袮    时间: 2009-3-16 23:10
标题: asp. net下使用foreach简化文本文件的访问。
很多时候,我们总是按照行的方式访问文本文件,使用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);  
    }  
    }  
}




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2