C# 一行一行地流式处理文件并保持进度?
我需要读取各种大小的文件,从1mb到2gb,因为这些文件可能有很大的大小,我正在对其进行流式处理C# 一行一行地流式处理文件并保持进度?,c#,winforms,.net-4.0,filestream,C#,Winforms,.net 4.0,Filestream,我需要读取各种大小的文件,从1mb到2gb,因为这些文件可能有很大的大小,我正在对其进行流式处理 我如何知道有多少文件被读取并跟踪,而不必预读所有行 示例代码 int count = 0; using (Stream stream = File.OpenRead(filename)) { using (StreamReader reader = new StreamReader(stream)) { string item = string.Empty;
- 我如何知道有多少文件被读取并跟踪,而不必预读所有行
int count = 0;
using (Stream stream = File.OpenRead(filename))
{
using (StreamReader reader = new StreamReader(stream))
{
string item = string.Empty;
while ((item = reader.ReadLine()) != null)
{
item = item.Replace("\"", ""); // remove unwanted double quotes
if (item.Length < 2) // dont need lines with less then 2 char
continue;
if (fine add to db)
count++; // to keep track of good lines
}
}
}
int count=0;
使用(Stream=File.OpenRead(文件名))
{
使用(StreamReader=新StreamReader(stream))
{
string item=string.Empty;
而((item=reader.ReadLine())!=null)
{
item=item.Replace(“\”,“”);//删除不需要的双引号
if(item.Length<2)//不需要少于2个字符的行
继续;
如果(精细添加到数据库)
count++;//跟踪好的行
}
}
}
您应该使用“Position”
属性,该属性由“Stream”
类中的“FileStream”
覆盖
看看
问题出在哪里?你正在流媒体,你正在通过db和计数器跟踪。@TimSchmelter如问题所述,我想跟踪文件的读取量,如果文件是2gb,我怎么知道我在接近它的末尾,等等?我拥有的计数器不是跟踪文件的读取量,而是跟踪tr确认好的条目。也许你会觉得这很有用:但我不知道文件中的行数,因为我正在流式传输它,所以我认为知道位置对我没有帮助。每个字符存储8个字节,正如你可能已经知道的那样。“长度”、“位置”的组合“角色大小将帮助您完成这一任务。如果您想确切地说出当前字符索引,那么应该使用更高级的类来进行读写过程,比如StringBuilder之类的。在这种情况下,您应该计算您拥有的基础数据。希望有帮助。@MohammadGoudarzi
每个字符存储8个字节(你可能已经知道了)
:)),这样我就可以简单地跟踪位置并与文件大小进行比较了?不确定它是否会以这种方式工作,但如果position是当前缓冲区,那么可以知道我离当前文件的总大小有多近,对吗?谢谢,我之前的评论使用您建议的Position属性Hanks效果很好,但这将打破不预读文件的要求,而且我不希望内存中出现2gb。这是一个很好的近似值,但并不精确yourFile.Length
包括\r\n
但goodLine
不是。@Guapo:File.ReadLines()
流式传输,并且不会“预读”整个文件。@AustinSalonen是,但是,您将所有数据存储在goodLines上,这将是相同的东西。@Guapo:文件。ReadLines
是惰性的,没有来计算任何东西<代码>文件。ReadAllLines
将完全按照您描述的方式执行。
var remaining = yourFile.Length;
var goodLines = File.ReadLines(yourFile.FullName)
.Select(line => line.Replace("\"", ""))
.Where(line => line.Length > 1);
foreach(var goodLine in goodLines)
{
// do something with goodLine
// this will be slightly off since you remove quotes.
remaining -= (goodLine.Length + Environment.NewLine.Length);
}