Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一行一行地流式处理文件并保持进度?_C#_Winforms_.net 4.0_Filestream - Fatal编程技术网

C# 一行一行地流式处理文件并保持进度?

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;

我需要读取各种大小的文件,从1mb到2gb,因为这些文件可能有很大的大小,我正在对其进行流式处理

  • 我如何知道有多少文件被读取并跟踪,而不必预读所有行
示例代码

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);
}