XmlDoc抛出进程无法从tome访问文件到时间?

时间:2015-05-13 09:43:24

标签: c# .net xml filestream xmldocument

我有以下用于编写基于datacontracts的XML文件的代码

public static void LogDataContractToFile(string XMLStringToLog, string filePathAndName)
        {
            //String documentPath = string.Empty;
            String xmlObject = string.Empty;

            FileInfo fileinfo;

            XmlDocumentFragment xmlDocumentFragment;
            XmlTextWriter xmlWriter;
            XmlDocument xmlDocument = null;

            lock (LogDataContractToFileLock)
            {

                filePathAndName = filePathAndName.ToLower();

                while (_workingWithFile.Contains(filePathAndName))
                    Thread.Sleep(1000);

                _workingWithFile.Add(filePathAndName.ToLower());

                try
                {

                    #region Create XMLFile
                    fileinfo = new FileInfo(filePathAndName);

                    if (!fileinfo.Exists)
                    {
                        DirectoryInfo info = new DirectoryInfo(fileinfo.DirectoryName);
                        if (info.Exists == false)
                            info.Create();

                        using (xmlWriter = new XmlTextWriter(filePathAndName, System.Text.Encoding.UTF8))
                        {
                            xmlWriter.Formatting = Formatting.Indented;
                            xmlWriter.WriteStartDocument();
                            xmlWriter.WriteStartElement("root");
                            xmlWriter.WriteStartElement("objects");
                            xmlWriter.WriteEndElement();
                            xmlWriter.WriteEndElement();
                            xmlWriter.WriteEndDocument();
                            xmlWriter.Close();
                        }
                    }
                    else
                    {
                        //Se så att filen är 50 MB eller mindre
                        while (fileinfo.Length > 52428800)
                        {
                            xmlDocument = new XmlDocument();
                            xmlDocument.Load(filePathAndName);

                            xmlDocument.RemoveChild(xmlDocument.LastChild);
                            xmlDocument.Save(filePathAndName);
                            xmlDocument = null;
                        }
                    }
                    #endregion

                    xmlObject = XMLStringToLog;

                    //Open document
                    xmlDocument = new XmlDocument();
                    xmlDocument.Load(filePathAndName);

                    //Create a new fragment in current document
                    xmlDocumentFragment = xmlDocument.CreateDocumentFragment();
                    xmlDocumentFragment.InnerXml = xmlObject;

                    //Add new fragment after the first child
                    xmlDocument.DocumentElement.InsertBefore(xmlDocumentFragment, xmlDocument.DocumentElement.FirstChild);
                    xmlDocument.Save(filePathAndName);
                    xmlDocument = null;
                }
                finally
                {
                    _workingWithFile.Remove(filePathAndName.ToLower());
                }
            }
        }

问题是我不时会遇到The process cannot access the file例外情况? XmlDocument没有任何处置,所以我不能使用。应如何妥善处理?

请注意,我坚持使用.NET 4.0。

1 个答案:

答案 0 :(得分:0)

要安全地检查元素并添加它(如果它不存在),您应该使用http://makeapppie.com/2014/10/20/swift-swift-using-attributed-strings-in-swift/

private readonly ConcurrentDictionary<string,bool> _workingWithFile = new ConcurrentDictionary<string,bool>();
public static void LogDataContractToFile(string XMLStringToLog, string filePathAndName)
{
    ...
    lock (LogDataContractToFileLock)
    {
        ...

        while(!_workingWithFile.TryAdd(filePathAndName, true))
        {
            Thread.Sleep(1000);
        }
        ...
        try
        {
            ...
        }
        finally
        {
            //Perhaps check the result here.
            bool result;
            _workingWithFile.TryRemove(filePathAndName, out result);
        }
    }
}