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
}
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
}