使用foreach简化文本文件的访问

来源:互联网 发布:电子乐制作软件 编辑:程序博客网 时间:2024/05/01 15:35

很多时候,我们总是按照行的方式访问文本文件,使用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);

}

}

}

 
原创粉丝点击