2017-07-26 42 views
0

我试图将文件保存到缓存(在Xamarin.Android中)。当调用下面的方法时,输入变量包含所有正确的数据。它也完成没有错误,但当我去阅读文件,它是空的(大小是正确的,但它包含全0)。PCL.Storage,OpenAsync()不写数据

public async Task<bool> SaveCache(Stream data, string id) 
{ 
    try 
    { 
     //cache folder in local storage 
     IFolder rootFolder = FileSystem.Current.LocalStorage; 
     var folder = await rootFolder.CreateFolderAsync("Cache", 
     CreationCollisionOption.OpenIfExists); 
     //save cached data 
     IFile file = await folder.CreateFileAsync(id + ".png", CreationCollisionOption.ReplaceExisting); 
     byte[] buffer = new byte[data.Length]; 
     data.Read(buffer, 0, buffer.Length); 
     using (Stream stream = await file.OpenAsync(PCLStorage.FileAccess.ReadAndWrite)) 
     { 
      stream.Write(buffer, 0, buffer.Length); 
     } 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

我也看到了从GitHub上的PCL.Storage库OpenAsync()方法,但该方法是很容易的,而且它做什么,我希望它做的事...

上午我做错了什么,或者你们对实际发生的事情有什么建议?

+0

你有没有检查调用'data.Read()'实际上正确的数据读入'buffer'阵列?你是否检查了调用'data.Read()'的结果并确定它没有返回'0'?一个可能的原因可能是data数据流位于底层数据的末尾,因此调用data.Read()基本上什么都不做,所以你正在为'stream'写一个空数组。 – bassfader

+0

确实是问题的缓冲区,我彻底检查了一下......但不是起点的偏移量,从那里读取,直到data.Length? – SparkyRih

回答

0

由于Stream.Read()方法总是从流的当前位置开始读取(see MSDN),因此在尝试读取任何内容之前应确保您处于正确的位置。

在你的情况下,它看起来像data Stream(作为参数提供)已经在基础数据的末尾,因此调用Stream.Read()基本上什么也不做。

要解决这个问题,您只需在尝试读取流内容之前将流找回到其数据的起始位置,例如使用Stream.Seek() method即可。所以,你的固定码例如可以是这个样子:

public async Task<bool> SaveCache(Stream data, string id) 
{ 
    try 
    { 
     //cache folder in local storage 
     IFolder rootFolder = FileSystem.Current.LocalStorage; 
     var folder = await rootFolder.CreateFolderAsync("Cache", 
     CreationCollisionOption.OpenIfExists); 

     //save cached data 
     IFile file = await folder.CreateFileAsync(id + ".png", CreationCollisionOption.ReplaceExisting); 
     byte[] buffer = new byte[data.Length]; 

     //make sure stream is at beginning of data, then read data into buffer 
     data.Seek(0, SeekOrigin.Begin); 
     data.Read(buffer, 0, buffer.Length); 
     using (Stream stream = await file.OpenAsync(PCLStorage.FileAccess.ReadAndWrite)) 
     { 
      stream.Write(buffer, 0, buffer.Length); 
     } 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 
+0

这就是这个问题的解决方案,非常感谢你......但是我没想到它用不同的日期来填充它,可能与编码有关? – SparkyRih

+0

此外,缓冲区仍然没有写入流...它仍然很... – SparkyRih

+0

没有填充在第一个地方,它与编码无关:当你初始化一个数组,它的所有项目都设置到该类型的项目的默认值,所以当你创建你的'buffer'数组时,它首先将只包含0,因为'byte'的默认值是0.(并且因为没有实际读取数据,它就像这样) – bassfader