2

我正在编写一个 windows phone 8 应用程序,我想让用户在我的应用程序中使用保存到他们 skydrive 的图像。我遇到问题的一段代码(我相信)如下。

StorageFile thefile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("b4b.png", CreationCollisionOption.ReplaceExisting);
        Uri theuri = new Uri("ms-appdata:///local/b4b.png");
        var thething = await client.BackgroundDownloadAsync(filepath, theuri); <--- line where program crashes
        BitmapImage src = new BitmapImage();
        src.SetSource((Stream)await thefile.OpenReadAsync());
        WriteableBitmap image = new WriteableBitmap(src);

用户需要做的所有登录和身份验证工作都已经完成,并且可以按预期工作。当我的程序到达标记线时,它突然崩溃了。我收到的错误是......

A first chance exception of type 'System.ArgumentException' occurred in Microsoft.Live.DLL
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.ni.dll
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.ni.dll
'TaskHost.exe' (CLR C:\windows\system32\coreclr.dll: Silverlight AppDomain): Loaded        'C:\windows\system32\en-US\mscorlib.debug.resources.dll'. Module was built without symbols.
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.ni.dll

有谁知道如何解决这一问题?

我插入断点来跟踪程序,似乎正在制作存储文件并且 uri 是正确的,但是当我尝试将文件下载到它时,程序给了我错误。我确认 skydrive 上文件的文件路径也是正确的。如果我尝试使用 DownloadAsync() 代替它似乎可以工作,但是当我尝试使用从 skydrive 文件获得的流时程序崩溃并给出相同的错误。

有任何想法吗?因为我无法弄清楚可能出了什么问题。

正在下载的文件是 png 图像。

编辑:找到解决方案

经过更多研究后,我发现当您从 skydrive 下载文件时,会调用文件 ID...

filepath = result.id;

如上所述,它不会为您提供文件的内容。我没有检查它获得了什么,但我认为它可能是元数据。要获取文件的实际内容,您必须添加“/contents”。

正确的路径将是

filepath = result.id + "/contents";

我编辑了我的代码,如下所示,它现在可以完美运行。

        StorageFile thefile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("b4b.png", CreationCollisionOption.ReplaceExisting);
        Uri theuri = new Uri("ms-appdata:///local/b4b.png", UriKind.Absolute);
        var thething = await client.DownloadAsync(filepath + "/content");
        Stream stream = thething.Stream;
        stream.Seek(0, SeekOrigin.Begin);
        BitmapImage src = new BitmapImage();
        src.SetSource(stream);

希望这可以帮助任何和我有同样问题的人!

4

1 回答 1

0

从@deboxturtle 的更新中,作为搜索的答案:

经过更多研究后,我发现当您从 skydrive 下载文件时,会调用文件 ID...

filepath = result.id;

如上所述,它没有给你文件的内容,你得到的文件元数据是 json。要获取文件的实际内容,您必须添加/content到 id。

正确的路径将是

filepath = result.id + "/content";

我编辑了我的代码,如下所示,它现在可以完美运行。

var filepath = result.id + "/content";
StorageFile thefile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
                              "b4b.png", CreationCollisionOption.ReplaceExisting);
var thething = await client.DownloadAsync(filepath);
Stream stream = thething.Stream;
stream.Seek(0, SeekOrigin.Begin);
BitmapImage src = new BitmapImage();
src.SetSource(stream);
于 2014-04-12T06:52:45.870 回答