XmlReader - 如何更新进度条
XmlReader - How to update progress bar
我正在使用 XmlReader 读取非常大的 XML 文件(超过 6GB 的数据)以加速一切并且工作得很好。
我在另一个线程中执行此操作(不使用后台工作程序)并且我不知道如何更新进度条,因为 XmlReader 不有某种 "current position, consumed bytes" 或类似的东西可以帮助我创建关于进度的平均计算。
我尝试使用 XmlReader 和 StreamReader 来计算每一行的字节数,然后根据 消耗的字节数 / 文件长度 * 100 更新进度条,但程序有时会给我一个错误,如
Name cannot begin with the '<' character, hexadecimal value 0x3C. Line 109, position 27.'
使用 StreamReader 时 Encoding.UTF8.GetByteCount(ReadLine())
。
实现这个的好方法是什么?
我在 google 上搜索并找到了一些实现此目的的方法,但没有使用 XmlReader,而且我不能不使用 XmlReader。
谢谢!
你可以看看底层流的位置:
using (var fileStream = File.OpenRead("somePath"))
{
using (var reader = XmlReader.Create(fileStream))
{
long lastPosition = 0;
while (reader.Read())
{
if (lastPosition != fileStream.Position)
{
lastPosition = fileStream.Position;
Console.WriteLine($"Read {lastPosition} from {fileStream.Length} ({100.0 * lastPosition / fileStream.Length}%)");
}
}
}
}
请注意,这将根据您使用的基础流为您提供不同的输出。在我的系统上,reader 读取 4KB 的块。
我正在使用 XmlReader 读取非常大的 XML 文件(超过 6GB 的数据)以加速一切并且工作得很好。
我在另一个线程中执行此操作(不使用后台工作程序)并且我不知道如何更新进度条,因为 XmlReader 不有某种 "current position, consumed bytes" 或类似的东西可以帮助我创建关于进度的平均计算。
我尝试使用 XmlReader 和 StreamReader 来计算每一行的字节数,然后根据 消耗的字节数 / 文件长度 * 100 更新进度条,但程序有时会给我一个错误,如
Name cannot begin with the '<' character, hexadecimal value 0x3C. Line 109, position 27.'
使用 StreamReader 时 Encoding.UTF8.GetByteCount(ReadLine())
。
实现这个的好方法是什么? 我在 google 上搜索并找到了一些实现此目的的方法,但没有使用 XmlReader,而且我不能不使用 XmlReader。
谢谢!
你可以看看底层流的位置:
using (var fileStream = File.OpenRead("somePath"))
{
using (var reader = XmlReader.Create(fileStream))
{
long lastPosition = 0;
while (reader.Read())
{
if (lastPosition != fileStream.Position)
{
lastPosition = fileStream.Position;
Console.WriteLine($"Read {lastPosition} from {fileStream.Length} ({100.0 * lastPosition / fileStream.Length}%)");
}
}
}
}
请注意,这将根据您使用的基础流为您提供不同的输出。在我的系统上,reader 读取 4KB 的块。