Загрузка XML-документа в режиме доступа только для чтения

Как загрузить XML-документ в режиме только для чтения?

У меня есть файл XML, который открывается в другом процессе, и я хочу загрузить его в свое приложение C # только для чтения.

XmlDocument.Load("file.xml") очевидно, бросает эту ошибку:

Процесс не может получить доступ к файлу, поскольку он используется другим процессом

Поэтому я тоже попробовал поток чтения:

FileStream fs = new FileStream("file.xml", FileMode.Open, FileAccess.Read);
xmldoc.Load(fs);

Но это также порождает ту же ошибку. Итак, как я могу получить доступ к моему XML-документу в режиме только для чтения?

Обновить

Я попробовал XPathDocumentи FileStream("file.xml", FileMode.Open, FileAccess.Read,FileShare.Read)как хорошо. Но ни одна из них не решила проблему.

c#,xml,file-access,

2

Ответов: 2


1 принят

Учитывая, что вы сказали, что FileShare.Readэто не работает, похоже, что в другом процессе файл открыт для записи.

Вы можете попробовать открыть его, FileAccess.Readи FileShare.ReadWriteв этом случае вам придется обрабатывать любые ошибки, которые могут возникнуть, если другой процесс действительно записывает файл.

Если это не сработает, вполне вероятно, что другой процесс откроется FileShare.None, и в этом случае вы ничего не сможете с этим поделать. Чтобы проверить это, попробуйте открыть файл, скажем, с помощью Блокнота.

Но возможно ли, чтобы FileShare.ReadWrite выдавал ошибку, если она работает в большинстве случаев?

Вы получите ошибку, только если другой процесс уже открыл файл FileShare.None. Вы подтвердили, что это не тот случай, когда он открыт в Microsoft Word, поэтому вы должны быть в порядке.


0

Этот класс Показывает прочитанный xml-файл в режиме только для чтения.

 public List<string[]> GetRunningOrderOnTable(string tableNo, int shopid)
        {
            try
            {
                XmlDocument xmlDoc = new XmlDocument();
                string xmlFilePath = @"C:inetpubwwwrootShopAPIXmlDataRunningTables.xml";
                //string xmlFilePath = HttpContext.Current.Server.MapPath("~/XmlData/RunningTables.xml");
      // Option 1
                //                FileStream xmlFile = new FileStream(xmlFilePath, FileMode.Open,
                //FileAccess.Read, FileShare.Read);
                //                xmlDoc.Load(xmlFile);
      // Option 2
                using (Stream s = File.OpenRead(xmlFilePath))
                {
                    xmlDoc.Load(s);
                }
                //xmlDoc.Load(xmlFilePath);
                List<string[]> st = new List<string[]>();
                XmlNodeList userNodes = xmlDoc.SelectNodes("//Tables/Table");
                if (userNodes != null)
                {
                    foreach (XmlNode userNode in userNodes)
                    {
                        string tblNo = userNode.Attributes["No"].Value;
                        string sid = userNode.Attributes["ShopID"].Value;
                        if (tblNo == tableNo && sid == shopid.ToString())
                        {
                            string[] str = new string[5];
                            str[0] = userNode.Attributes["No"].Value;
                            str[1] = userNode.InnerText; // OrderNumber
                            str[2] = userNode.Attributes["OrderID"].Value;
                            str[3] = userNode.Attributes["OrderedOn"].Value;
                            str[4] = userNode.Attributes["TotalAmount"].Value;
                            st.Add(str);
                        }
                    }
                }
                else return new List<string[]>();
                return st;
            }
            catch (Exception ex)
            {

                CustomLogging.Log("RunningTables.xml GetRunningOrderOnTable Error " + ex.StackTrace, LoggingType.XMLRead);
                return new List<string[]>();
            }
        }
C #, XML, доступ к файлам,
Похожие вопросы