C# - 无法访问文件 "X",因为它已被另一个进程使用

C# - Cannot access the file "X" because it is used by another process

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");
        }

我在保存文档时遇到问题。它 returns 我是一个异常,说该文件正在被另一个进程使用。我也尝试使用 FileStream,但没有成功。我需要使用指定的相同文档。我还尝试在文件被另一种方法使用后删除该文件,但出现相同的错误。用日期和时间保存它使它独一无二并且可以工作,但是很难以这种格式在另一种方法中使用它。有什么想法吗?

根据我们在评论区与您的对话,我认为问题出在您使用的方法上→

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
}