如何在Windows通用应用程序中读取文本文件

我正在尝试阅读一个名为thedata.txt的文本文件,其中包含我想在刽子手游戏中使用的单词列表。 我尝试了不同的方法,但我无法确定文件的放置位置,如果应用程序运行的话。 我将文件添加到我的项目中,我尝试将构建属性设置为内容,然后嵌入资源,但找不到该文件。 我制作了一个Windows 10通用应用程序项目。 我试过的代码看起来像这样:

Stream stream = this.GetType().GetTypeInfo().Assembly.GetManifestResourceStream("thedata.txt"); using (StreamReader inputStream = new StreamReader(stream)) { while (inputStream.Peek() >= 0) { Debug.WriteLine("the line is ", inputStream.ReadLine()); } } 

我得到例外。 我还尝试列出另一个目录中的文件:

  string path = Windows.Storage.ApplicationData.Current.LocalFolder.Path; Debug.WriteLine("The path is " + path); IReadOnlyCollection files = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFilesAsync(); foreach (StorageFile file2 in files) { Debug.WriteLine("Name 2 is " + file2.Name + ", " + file2.DateCreated); } 

我也没有看到那里的文件…我想避免在我的程序中对名称列表进行硬编码。 我不确定该文件的路径是什么。

代码非常简单,您只需使用有效的方案URI(在您的情况下为ms-appx)并将WinRT InputStream转换为经典的.NET流:

 var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///thedata.txt")); using (var inputStream = await file.OpenReadAsync()) using (var classicStream = inputStream.AsStreamForRead()) using (var streamReader = new StreamReader(classicStream)) { while (streamReader.Peek() >= 0) { Debug.WriteLine(string.Format("the line is {0}", streamReader.ReadLine())); } } 

对于嵌入文件的属性,“Build Action”必须设置为“Content”,“Copy to Ouput Directory”应设置为“Do not Copy”。

您无法在Windows运行时应用程序中使用经典的.NET IO方法,在UWP中读取文本文件的正确方法是:

 var file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.txt"); var lines = await FileIO.ReadLinesAsync(file); 

此外,您不需要文件夹的物理路径 – 来自msdn :

不要依赖此属性来访问文件夹,因为某些文件夹不能使用文件系统路径。 例如,在下列情况下,文件夹可能没有文件系统路径,或者文件系统路径可能不可用。 •该文件夹表示一组文件的容器(例如,来自GetFoldersAsync方法的某些重载的返回值),而不是文件系统中的实际文件夹。 •文件夹由URI支持。 •使用文件选择器拾取文件夹。

有关详细信息,请参阅文件访问权限 。 创建,编写和读取文件提供了与Windows 10上的UWP应用程序的文件IO相关的示例。

您可以使用应用URI直接从应用的本地文件夹中检索文件,如下所示:

 using Windows.Storage; StorageFile file = await StorageFile.GetFileFromApplicationUriAsync("ms-appdata:///local/file.txt");