-3
if(!File.Exists(_logFilePath))
            {
                File.WriteAllText(_logFilePath, "<?xml version='1.0' encoding='utf-8' standalone='yes'?>\r\n <AppXmlLogWritter></AppXmlLogWritter>");
            }   

 using (FileStream fileStream = new FileStream(_logFilePath, FileMode.OpenOrCreate, 
           FileAccess.ReadWrite, FileShare.ReadWrite))
    {
        string currentDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

        XmlDocument xmlDoc = new XmlDocument();

        xmlDoc.Load(_logFilePath);
        XmlElement newelement = xmlDoc.CreateElement("LogData");
        XmlElement xmlLogID = xmlDoc.CreateElement("LogID");
        XmlElement xmlLogDateTime = xmlDoc.CreateElement("LogDateTime");
        XmlElement xmlLogType = xmlDoc.CreateElement("LogType");
        XmlElement xmlLogFlag = xmlDoc.CreateElement("LogFlag");
        XmlElement xmlLogApplication = xmlDoc.CreateElement("LogApplication");
        XmlElement xmlLogModule = xmlDoc.CreateElement("LogModule");
        XmlElement xmlLogLocation = xmlDoc.CreateElement("LogLocation");
        XmlElement xmlLogText = xmlDoc.CreateElement("LogText");
        XmlElement xmlLogStackTrace = xmlDoc.CreateElement("LogStackTrace");

        xmlLogID.InnerText = _logIDPrefix + currentDateTime + randomNumber;
        xmlLogDateTime.InnerText = currentDateTime;
        xmlLogType.InnerText = ((LogTypes)Convert.ToInt32(logType)).ToString();
        xmlLogFlag.InnerText = logFlag;
        xmlLogApplication.InnerText = _logApplication;
        xmlLogModule.InnerText = logModule;
        xmlLogLocation.InnerText = logLocation;
        xmlLogText.InnerText = logText;
        xmlLogStackTrace.InnerText = logStackTrace;

        newelement.AppendChild(xmlLogID);
        newelement.AppendChild(xmlLogDateTime);
        newelement.AppendChild(xmlLogType);
        newelement.AppendChild(xmlLogFlag);
        newelement.AppendChild(xmlLogApplication);
        newelement.AppendChild(xmlLogModule);
        newelement.AppendChild(xmlLogLocation);
        newelement.AppendChild(xmlLogText);

        xmlDoc.DocumentElement.AppendChild(newelement);
        xmlDoc.Save(_logFilePath);
    }

如何在线克服以下错误xmlDoc.Load(_logFilePath);

该进程无法访问该文件,因为它正被另一个进程使用。

4

3 回答 3

1

发生错误是因为您正在使用带有读写锁的 FileStream 打开文件,而在您尝试使用 xmlDoc.Load() 方法读取文件后不久。由于文件被 FileStream 锁定,这会导致异常。

您似乎无缘无故地打开了 FileStream,因为您没有使用它。使用 FileStream 简单地删除 using 语句。

删除它之后,剩下的是 xmlDoc.Load() 调用,然后是 xmlDoc.Save() 调用。由于您使用这些方法直接加载文件,并且您不会锁定文件超过必要的时间。那应该行得通。

于 2013-01-15T12:40:14.523 回答
0

即使您说加载 XML 会给您带来此错误,我也看到了您需要纠正的一个主要缺陷。xmlDoc在块外声明using,并以同样的方式在块外调用xmlDoc.Save

例子:

var xmlDoc = new XmlDocument();
using (var fileStream = new FileStream(_logFilePath, FileMode.Open,
FileAccess.Read, FileShare.None))
{
    xmlDoc.Load(fileStream);
    //Do the rest
}
xmlDoc.Save(_logFilePath);

编辑:我刚刚注意到你甚至没有使用FileStream你创建的。您可以删除其声明。

var xmlDoc = new XmlDocument();
xmlDoc.Load(_logFilePath);
//Do the rest
xmlDoc.Save(_logFilePath);
于 2013-01-15T12:33:50.883 回答
0

好的,结合了 Eve 和 Maarten 的前两个答案。如果您使用的是,FileStream则在XmlDocument.Load方法中使用它而不是_logFilePath您当前使用的变量。如果你使用FileStreamthen 你不会得到独占读/写访问错误,但如果你只使用文件位置,你会的。因此,正如 Eve 所指出的,将您的代码更改为:

using (FileStream fileStream = new FileStream(_logFilePath, FileMode.OpenOrCreate, 
       FileAccess.ReadWrite, FileShare.ReadWrite))
{
    string currentDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

    XmlDocument xmlDoc = new XmlDocument();

    xmlDoc.Load(fileStream); //instead of xmlDoc.Load(_logFilePath)

    //other stuff

}
于 2013-01-15T12:49:23.327 回答