通用Windows - 等待FileIO.WriteBytesAsync()似乎没有等待文件写入

Sno*_*arg 0 c# uwp

我正在尝试一些应该直截了当的东西,保存然后在UWP中加载文件.(通用Windows平台)然而,它并不总是有效.

功能:

public async Task<bool> WriteFile(string fileName, byte[] byteArray){
        StorageFolder folder = ApplicationData.Current.LocalFolder;
        StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

        await FileIO.WriteBytesAsync(file, byteArray);
        return true;
}

public async Task<IBuffer> ReadFile(string fileName){
        StorageFolder folder = ApplicationData.Current.LocalFolder;
        StorageFile file = await folder.GetFileAsync(fileName);

        IBuffer buffer = await FileIO.ReadBufferAsync(file);

        return buffer;
}
Run Code Online (Sandbox Code Playgroud)

来电代码:

byte[] fancyByteArray = { 0,1,2,3,4,5 };
Task<bool> t = WriteFile("Testfile", fancyByteArray);
Task<byte[]> task = ReadFile("Testfile");
IBuffer res = task.Result;
Run Code Online (Sandbox Code Playgroud)

嗯,这有时会起作用.这就是问题,因为有时它不起作用!有时文件似乎是创建或重新创建的,但没有内容.(磁盘上的大小是零字节)有时我得到一个文件不存在的错误.

它不是一个大文件,64字节,所以它不能与"大文件仍然被写入"磁盘有关.

我假设"await"的意思是"等到那些darn字节写入磁盘",但也许我错了?!也许我应该以某种方式检查事情是否已完成写入磁盘?

据我所知,我正在使用Visual Studio Community 2017,最新的一切.应用程序目标版本设置为"Windows 10 Anniversary Edition(10.0; Build 14393)".

AVK*_*AVK 6

await在方法内部,但不等待您的实际通话.所以在写完成之前,它会尝试读取文件的内容.

相反,等待你ReadFileWriteFile像下面.

byte[] fancyByteArray = { 0, 1, 2, 3, 4, 5 };  
bool t = await WriteFile("Testfile", fancyByteArray);  
byte[] task = await ReadFile("Testfile");
Run Code Online (Sandbox Code Playgroud)

而你WriteFileReadFile应该像下面

public async Task<bool> WriteFile(string fileName, byte[] byteArray)  
{  
    StorageFolder folder = ApplicationData.Current.LocalFolder;  
    StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);  
    await FileIO.WriteBytesAsync(file, byteArray);  
    return true;  
}  

public async Task<byte[]> ReadFile(string fileName)  
{  
    StorageFolder folder = ApplicationData.Current.LocalFolder;  
    StorageFile file = await folder.GetFileAsync(fileName);  
    IBuffer buffer = await FileIO.ReadBufferAsync(file);  
    return buffer.ToArray();  
}
Run Code Online (Sandbox Code Playgroud)

更新:

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    byte[] fancyByteArray = { 0, 1, 2, 3, 4, 5 };
    bool t = await WriteFile("Testfile", fancyByteArray);
    byte[] task = await ReadFile("Testfile");
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.