代码之家  ›  专栏  ›  技术社区  ›  SparkyRih

PCL。存储,OpenAsync()未写入数据

  •  0
  • SparkyRih  · 技术社区  · 9 年前

    我正在尝试保存一个文件以缓存(在Xamarin.Android中)。当调用下面的方法时,输入变量包含所有正确的数据。它也完成了,没有错误,但当我去读取文件时,它是空的(大小是正确的,但它包含所有0)。

    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;
        }
    }
    

    OpenAsync() 方法。GitHub上的存储库,但该方法非常简单,并且它做了我期望它做的事情。。。

    我做错什么了,还是你们对实际发生的事情有什么建议?

    1 回复  |  直到 8 年前
        1
  •  0
  •   bassfader    9 年前

    Stream.Read() see MSDN ),在尝试阅读任何内容之前,你应该确保自己处于正确的位置。

    data 流(作为参数提供)已经位于底层数据的末尾,因此调用 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;
        }
    }