где утечка в моем коде? - PullRequest
3 голосов
/ 18 мая 2009

Вот мой код, который открывает файл XML (old.xml), фильтрует недопустимые символы и записывает в другой файл XML (abc.xml). Наконец, я снова загружу XML (abc.xml). При выполнении следующей строки, исключение говорит, что файл xml используется другим процессом,

xDoc.Load("C:\\abc.xml");

У кого-нибудь есть идеи, что не так? Есть ли утечки в моем коде и почему (я все время использую ключевое слово «using», смущенный, чтобы увидеть утечки ...)?

Вот весь мой код, я использую C # + VSTS 2008 под Windows Vista x64.

    // Create an instance of StreamReader to read from a file.
    // The using statement also closes the StreamReader.
    Encoding encoding = Encoding.GetEncoding("utf-8", new EncoderReplacementFallback(String.Empty), new DecoderReplacementFallback(String.Empty));
    using (TextWriter writer = new StreamWriter(new FileStream("C:\\abc.xml", FileMode.Create), Encoding.UTF8))
    {
        using (StreamReader sr = new StreamReader(
            "C:\\old.xml",
            encoding
            ))
        {
            int bufferSize = 10 * 1024 * 1024; //could be anything
            char[] buffer = new char[bufferSize];
            // Read from the file until the end of the file is reached.
            int actualsize = sr.Read(buffer, 0, bufferSize);
            writer.Write(buffer, 0, actualsize);
            while (actualsize > 0)
            {
                actualsize = sr.Read(buffer, 0, bufferSize);
                writer.Write(buffer, 0, actualsize);
            }
        }
    }

    try
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("C:\\abc.xml");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

EDIT1: я попытался изменить размер буфера с 10M до 1M, и это работает! Я так растерялся, есть идеи?

РЕДАКТИРОВАТЬ2: Я считаю, что эту проблему очень легко воспроизвести, когда входной старый XML-файл очень большой, например, 100M или что-то в этом роде. Я подозреваю, что это известная ошибка .Net? Я собираюсь использовать такие инструменты, как ProcessExplorer / ProcessMonitor, чтобы увидеть, какой процесс блокирует файл, чтобы предотвратить доступ к нему XmlDocument.Load.

Ответы [ 11 ]

0 голосов
/ 18 мая 2009

Выполнить Process Explorer

Убедитесь, что ваша программа сначала блокирует файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...