等待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),但它是一样的。现在我认为这与asyncawait有关。我希望有一种方法可以不使用它们而做到这一点。

编辑:
我没有张贴这个答案,因为我意识到它解决了这个问题,但问题没有包含足够的信息来得到答案。

解决方案是,我没有在调用此方法的方法上使用await。我本想删掉的,但我想也许能帮到别人。感谢所有试图解决这个问题的人

等待FileIO.ReadTextAsync给出错误(编辑:现在使用IStorageFile.OpenReadAsync

首先您可以检查文件(Assets/AV/someone.txt)的属性。

建立行动 应该是内容。但不是嵌入式资源或其他。

如果仍然出错。然后检查文件是否存在