Измените кодировку на UTF-8 в потоке (MemoryMappedViewStream) - PullRequest
3 голосов
/ 19 августа 2011

Я использую код ниже, чтобы читать ~ 2,5 ГБ XML-файл так быстро, как я могу (благодаря MemoryMappedFile).Однако я получаю следующее исключение: " '.', Шестнадцатеричное значение 0x00, является недопустимым символом. Строка 9778, позиция 73249406. ".Я полагаю, это связано с проблемой кодирования.Как мне убедиться, что MemoryMappedViewStream читает файл с использованием UTF-8?

static void Main(string[] args)
{
    using (var file = MemoryMappedFile.CreateFromFile(@"d:\temp\temp.xml", FileMode.Open, "MyMemMapFile"))
    {
        using (MemoryMappedViewStream stream = file.CreateViewStream())
        {
            Read(stream);
        }
    }
}

static void Read(Stream stream)
{
    using (XmlReader reader = XmlReader.Create(stream))
    {
        reader.MoveToContent();

        while (reader.Read())
        {
        }
     }
 }

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Вы можете использовать класс StreamReader для установки кодировки:

static void Main(string[] args)
{
  using (var file = MemoryMappedFile.CreateFromFile(@"d:\temp\temp.xml", FileMode.Open,  "MyMemMapFile"))
  {
     using (MemoryMappedViewStream stream = file.CreateViewStream())
    {
        Read(stream);
    }
   }
}

static void Read(Stream stream)
{
  using (XmlReader reader = XmlReader.Create(new StreamReader(stream, Encoding.UTF8)))
  {
     reader.MoveToContent();

    while (reader.Read())
    {
    }
 }
}

Надеюсь, это поможет.

0 голосов
/ 19 августа 2011

На MSDN вы получаете следующее.

"XmlReader сканирует первые байты потока в поисках метки порядка байтов или другого знака кодирования"

Указывает ли ваш xml-файл кодировку?

<?xml version="1.0" encoding="UTF-8"?>
...