使用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

ºº×Ö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);

}

}

}

Published At
Categories with Web编程
Tagged with
comments powered by Disqus