PCL.Storage,OpenAsync()不写数据
问题描述:
我试图将文件保存到缓存(在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()
方法,但该方法是很容易的,而且它做什么,我希望它做的事...
上午我做错了什么,或者你们对实际发生的事情有什么建议?
答
由于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;
}
}
你有没有检查调用'data.Read()'实际上正确的数据读入'buffer'阵列?你是否检查了调用'data.Read()'的结果并确定它没有返回'0'?一个可能的原因可能是data数据流位于底层数据的末尾,因此调用data.Read()基本上什么都不做,所以你正在为'stream'写一个空数组。 – bassfader
确实是问题的缓冲区,我彻底检查了一下......但不是起点的偏移量,从那里读取,直到data.Length? – SparkyRih