等待FileIO.ReadTextAsync给出错误(编辑:现在使用IStorageFile.OpenReadAsync
本文关键字:OpenReadAsync IStorageFile 编辑 ReadTextAsync FileIO 出错 错误 等待 | 更新日期: 2023-09-27 18:09:50
我在我的项目中有这个方法。这是它应该做的:
它接受一个字符串,该字符串是我的项目的Assets文件夹中AV文件夹中的文件名称。它打开该文件并对其执行一些操作(并非所有所需的操作都在代码中)。
public async static Task<Book> ParseFile(string bookN)
{
string bookName = bookN.Replace(" ", "");
StorageFile bookFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/AV/" + bookName + ".txt"));
string content = await FileIO.ReadTextAsync(bookFile);
string chapterStr = "CHAPTER";
int numOfChapters = Utilities.NumOfTimesStringOccurs(content, chapterStr);
Book book = new Book(bookName, numOfChapters);
//book.Chapters = new List<Chapter>(numOfChapters);
return book;
}
问题出在这一行:
string content = await FileIO.ReadTextAsync(bookFile);
我知道这是因为我在方法的第一行设置了一个断点。在进入代码之后,该特定的行中断并打开.g.cs
文件,并突出显示了明显暗示编译器无法跟踪它的行。这行必须与diagnostics.debugger
或类似的东西有关。
我尝试的下一步是放入try
并在MessageDialog
中显示错误。这个错误是:
Object reference was not found
或类似的东西。
我想可能是
这一行 StorageFile bookFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/AV/" + bookName + ".txt"));
会导致这种情况,因为它有await
,所以可能在下一行执行之前操作还没有完成。但是我不认为它会很慢,因为文件夹中的文件平均每个只有5 - 6kb。
我不知道什么是错的,因为这是我第一次使用Storage
命名空间类,因为我是Windows Store编程的新手。
编辑
在浏览了这个MSDN论坛之后,我将代码更改为:
StorageFile bookFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/AV/" + bookName + ".txt"));
Windows.Storage.Streams.IRandomAccessStream ras = await bookFile.OpenReadAsync();
Windows.Storage.Streams.DataReader reader = new Windows.Storage.Streams.DataReader(ras.GetInputStreamAt(0));
int numOfBytes = (int)ras.Size;
Byte[] bytes = new Byte[numOfBytes - 1];
await reader.LoadAsync((uint)numOfBytes);
reader.ReadBytes(bytes);
string content = Convert.ToBase64String(bytes);
这段代码实际上应该可以工作,因为当我在断点期间执行它时,没有错误。但由于某些我无法理解的原因,这个应用程序没有反应。当我设置断点并进入代码时,它工作了(我的意思是它不会中断;它不会给我预期的输出),但是当没有输出时,它会"冻结"。
我最初认为是文件的大小(201 kB)花了太长时间,所以我把它改成了另一个小得多的大小(~3 kB),但它是一样的。现在我认为这与async
和await
有关。我希望有一种方法可以不使用它们而做到这一点。
编辑:
我没有张贴这个答案,因为我意识到它解决了这个问题,但问题没有包含足够的信息来得到答案。
解决方案是,我没有在调用此方法的方法上使用await
。我本想删掉的,但我想也许能帮到别人。感谢所有试图解决这个问题的人
首先您可以检查文件(Assets/AV/someone.txt)
的属性。
建立行动 应该是内容。但不是嵌入式资源或其他。
如果仍然出错。然后检查文件是否存在