用处:C#读取大文本文件,几百M或者上G的; 文本处理到一半,关闭软件,下次继续处理剩余文本用到.
/// <summary>
/// 多行读取;
/// </summary>
/// <param name="sr">StreamReader</param>
/// <param name="rows">行数</param>
/// <param name="len">偏移量</param>
/// <returns></returns>
public string readLines(StreamReader sr, int rows, out int len)
{
int count = 0;
len = 0;
StringBuilder stringBuilder = new StringBuilder();
while (true)
{
int num;
while (true)
{
num = sr.Read();
if (num == -1)
{
goto IL_43;
}
if (num > 127)
{
len += 2;//me;
}
else
{
len += 1;
}
if (num == 13 || num == 10)
{
count++;
break;
}
stringBuilder.Append((char)num);
}
if (num == 13 && sr.Peek() == 10)
{
sr.Read();
len +=1;//me;
}
if (count == rows)
{
break;
}
else
{
stringBuilder.Append("\r\n");
}
}
return stringBuilder.ToString();
IL_43:
if (stringBuilder.Length > 0)
{
return stringBuilder.ToString();
}
return null;
}
/// <summary>
///
//
//
/// </summary>
/// <param name="path">路径</param>
/// <param name="filePositionIndex">读取起始位置(gb18030编码小于等于127占1字节,大于127占2字节),返回结束位置;</param>
/// <param name="rows">要读取的行数;</param>
/// <param name="encoding">编码(gb18030)</param>
/// <returns></returns>
public string readLines(string path, ref long filePositionIndex, int rows, string encoding="gb18030")
{
//判断编码
encoding = encoding.ToLower();
if (encoding.Equals("utf8") || encoding.Equals("utf-8"))
{
encoding = "utf8"; ;
}
FileStream fs = null;
StreamReader sr = null;
try
{
string msg = null;
fs = new FileStream(path, FileMode.Open, FileAccess.Read);
fs.Position = filePositionIndex;
if (encoding.Equals("utf8"))
{
sr = new StreamReader(fs, Encoding.UTF8);
}
else
{
sr = new StreamReader(fs, Encoding.GetEncoding("gb18030"));
}
int len = 0;
msg = readLines(sr, rows, out len);
filePositionIndex = filePositionIndex + len;
return msg.Trim();
}
finally
{
if (fs != null)
{
fs.Close();
}
if (sr != null)
{
sr.Close();
}
}
}