C # - не удается получить доступ к файлу «X», потому что он используется другим процессом - PullRequest
0 голосов
/ 30 августа 2018
if (!File.Exists(signatureFile))
        {

            XElement signature;

            try
            {

                XNamespace ns = "http://www.w3.org/2000/09/xmldsig#";

                signature = new XElement("DocumentSignature", new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"), new XAttribute(XNamespace.Xmlns + "xsd", "http://www.w3.org/2001/XMLSchema"),
                new XElement("Files", new XAttribute("id", "files"),
                        new XElement("File", new XAttribute("file_name", file), new XAttribute("digestmethod", "http://www.w3.org/2000/09/xmldsig#sha1"), new XAttribute("archive_path", "data/" + file), "/E06svX3vAnvYnnGlMT9auuh8uE=")),
                    //new XElement("File", new XAttribute("file_name", file), new XAttribute("digestmethod", "http://www.w3.org/2000/09/xmldsig#sha1"), new XAttribute("archive_path", "data/"  + file), "x5kx5oXhxZ/lLGZ0iLTFLL3XVig=")),
                    new XElement("Attributes",
                        new XElement("Attribute", new XAttribute("id", "ad_ret_policy"), new XAttribute("system_attribute", "false"), new XAttribute("readonly", "false"),
                            new XElement("Value", metadata["Retention Policy"])),
                        new XElement("Attribute", new XAttribute("id", "ad_keepyears"), new XAttribute("system_attribute", "false"), new XAttribute("readonly", "false"),
                            new XElement("Value", metadata["Keep years"])),
                        new XElement("Attribute", new XAttribute("id", "ad_classification"), new XAttribute("system_attribute", "false"), new XAttribute("readonly", "false"),
                            new XElement("Value", metadata["Classification plan"])),
                        new XElement("Attribute", new XAttribute("id", "ad_permanent"), new XAttribute("system_attribute", "false"), new XAttribute("readonly", "false"),
                            new XElement("Value", metadata["Permanent"])),
                        new XElement("Attribute", new XAttribute("id", "ad_keywords"), new XAttribute("system_attribute", "false"), new XAttribute("readonly", "false"),
                            new XElement("Value", metadata["Keywords"])),
                        new XElement("Attribute", new XAttribute("id", "ad_archive"), new XAttribute("system_attribute", "false"), new XAttribute("readonly", "false"),
                            new XElement("Value", metadata["Archive"])),
                        new XElement("Attribute", new XAttribute("id", "ad_is_long_term_format"), new XAttribute("system_attribute", "false"), new XAttribute("readonly", "false"),
                            new XElement("Value", "false"))));                                        //END OF ATTRIBUTES SNIPPET

                signature.Save(signatureFile);
            }
            catch (Exception ex)
            {
                ex.ToString();
                Program.logger.Error(ex);
                throw;
            }
        }
        else
        {
            XDocument doc = XDocument.Load(signatureFile);

            XElement items = doc.Root.Descendants("File").FirstOrDefault();
            items.ReplaceWith(new XElement("File", new XAttribute("file_name", file), new XAttribute("digestmethod", "http://www.w3.org/2000/09/xmldsig#sha1"), 
                new XAttribute("archive_path", "data/" + file), "/E06svX3vAnvYnnGlMT9auuh8uE="));

            doc.Save("C:\\Docs\\modified.xml");
        }

У меня проблема с сохранением документа. Это возвращает мне исключение, говорящее, что файл используется другим процессом. Я также пытался использовать FileStream, но безуспешно. Мне нужно использовать тот же документ, как указано. Я также попытался удалить файл после того, как он был использован другим методом, с той же ошибкой. Сохранение с указанием даты и времени делает его уникальным и работает, но его трудно использовать в другом методе в таком формате. Есть идеи?

1 Ответ

0 голосов
/ 30 августа 2018

Исходя из нашего разговора с вами в разделе комментариев, я считаю, что проблема заключается в методе, который вы используете →

doc.Load(new XmlTextReader(FileName))

Обратите внимание, что XmlTextReader реализует интерфейс IDisposable и использует Stream для чтения файла, который вы предоставляете в методе, по Filename. Поскольку вы неправильно распорядились new XmlTextReader(FileName), поток файлов по-прежнему открыт, и вполне естественно, что вы получаете исключение, что файл используется другим приложением. Я предлагаю вам использовать using, как показано ниже, потому что он правильно утилизирует XmlTextReader

using (var textReader = new XmlTextReader(FILENAME)){
    XDocument doc = XDocument.Load(textReader);
    //DO STUFF
}
...