如何从内存流中读取文本文件而不丢失字节
本文关键字:文件 字节 取文本 读取 内存 | 更新日期: 2023-09-27 18:24:40
我正在编写一些代码来学习新的c#异步设计模式。所以我想写一个小的windows窗体程序,它可以计算文本文件的行和字,并显示阅读进度。
为了避免磁盘交换,我将文件读取到MemoryStream中,然后构建一个StreamReader来逐行读取文本并计数。
问题是我无法正确更新进度条。我读了一个文件,但总是缺少字节,所以进度条没有完全填满。
需要一只手或一个想法来实现这一点。感谢
public async Task Processfile(string fname)
{
MemoryStream m;
fname.File2MemoryStream(out m); // custom extension which read file into
// MemoryStream
int flen = (int)m.Length; // store File length
string line = string.Empty; // used later to read lines from streamreader
int linelen = 0; // store current line bytes
int readed = 0; // total bytes read
progressBar1.Minimum = 0; // progressbar bound to winforms ui
progressBar1.Maximum = flen;
using (StreamReader sr = new StreamReader(m)) // build streamreader from ms
{
while ( ! sr.EndOfStream ) // tried ( line = await sr.ReadLineAsync() ) != null
{
line = await sr.ReadLineAsync();
await Task.Run(() =>
{
linelen = Encoding.UTF8.GetBytes(line).Length; // get & update
readed += linelen; // bytes read
// custom function
Report(new Tuple<int, int>(flen, readed)); // implements Iprogress
// to feed progress bar
});
}
}
m.Close(); // releases MemoryStream
m = null;
}
分配给flen的总长度包括每行的回车。ReadLineAsync()函数返回一个不包含回车的字符串。我的猜测是,进度条中丢失的字节数量与正在读取的文件中回车的数量成正比。