如何在C#UWA(通用Windows应用程序)中读取和写入文件

时间:2016-10-08 17:01:24

标签: c# win-universal-app

我试图弄清楚如何在UWA应用程序中读取和写入文件。我知道我需要打开一个FileStreamm,但我无法弄清楚如何做到这一点。

我从这段代码开始:

FileStream fs = new FileStream(@"C:\XML\test.txt", FileMode.Create, FileAccess.Write);

似乎有效,没有红线。

在所有这一切结束时,我被告知放入FlushClose,就像这样:

FileStream fs = new FileStream(@"C:\XML\test.txt", FileMode.Create, 

...

fs.Flush();
fs.Close();

现在,这是我遇到麻烦的地方,因为fs.Close();甚至不在fs上的函数列表中。如果我尝试对其进行硬编码,我的IDE中会出现一条红线。

有人可以请花点时间帮助我了解如何使用西澳大利亚州做到这一点吗?出于某种原因,似乎在Windows 10应用程序中存在不同的方法,并且我很难找到任何能够向我展示如何正确执行此操作的方法。所有教程和SOF论坛输入都是关于旧版本(非UWA)。

当我在控制台应用程序中执行此操作时,它将按预期工作。

我的最终目标是能够以这种方式读取和写入XML文件:

XDocument doc = XDocument.Load(input);
XElement person = doc.Element("Person");
person.Add(new XElement("Employee",
           new XElement("Name", "David"),
           new XElement("Dept", "Chef")));
doc.Save(output);

我沿着这条路走下去,因为对我之前的问题的回答告诉我使用FileStream,但我根本无法在UWA中完成这项工作。

2 个答案:

答案 0 :(得分:2)

您不能只访问通用Windows应用程序中的任何文件。对文件系统的访问受到限制。

有关详细信息,请参阅the documentation

为了进一步帮助您,我们需要了解您的应用程序的更多信息。您想要访问什么类型的文件?

有关如何读取Xml文件,修改它并将其存储在通用应用程序中的示例。您需要一个带有以下Click处理程序的按钮和一个名为" TextBoxLog"的文本框。

private async void ButtonDemo_Click(object sender, RoutedEventArgs e)
{
     // Get our local storage folder
     var localFolder = ApplicationData.Current.LocalFolder;

     XmlDocument xmlDocument;

     // Try to get file 
     var file = await localFolder.TryGetItemAsync("MyData.xml") as IStorageFile;

     if(file != null)
     {
          // File exists -> Load into XML document
          xmlDocument = await XmlDocument.LoadFromFileAsync(file);
     }
     else
     {
          // File does not exist, create new document in memory
          xmlDocument = new XmlDocument();
          xmlDocument.LoadXml(@"<?xml version=""1.0"" encoding=""UTF-8""?>" + Environment.NewLine + "<root></root>");
     }

     // Now show the current contents
     TextBoxLog.Text = "";

     var lEntries = xmlDocument.GetElementsByTagName("Entry");
     foreach(var lEntry in lEntries)
     {
          TextBoxLog.Text += lEntry.InnerText + Environment.NewLine;
     }

     // Now add a new entry
     var node = xmlDocument.CreateElement("Entry");
     node.InnerText = DateTime.Now.ToString();
     xmlDocument.DocumentElement.AppendChild(node);

     // If the file does not exist yet, create it
     if(file == null)
     {
          file = await localFolder.CreateFileAsync("MyData.xml");
     }

     // Now save the document
     await xmlDocument.SaveToFileAsync(file);

}

答案 1 :(得分:0)

好的,(简单)解决方案是将xml文件放在PROJECTFOLDER / bin / x86 / debug / appX中,然后以这种方式将数据写入列表:

public class dataRaw
    {
        public string data { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }
    }

    //You can call this class with x = collectionGenerator.getList() (it returns a list<T>)
    public class collectionGenerator
    {
       public static List<dataRaw> getList()
        {
            //This is the xml file in the folder
            var doc = XDocument.Load("Data.xml"); 

            //This parse the XML and adds in to the list "dataList"
            var dataList = doc.Root
                .Descendants("Person")
                .Select(node => new dataRaw
                {
                    //data, firstName and lastName are in app variables from dataRaw put into listData.
                    //Number, FirstName and LastName are the nodes in the XML file.
                    data = node.Element("Number").Value,
                    firstName = node.Element("FirstName").Value,
                    lastName = node.Element("LastName").Value,
                })
            .ToList();
            return dataList;
        }
    }