从byte []数组共享StorageItems

时间:2012-07-23 12:23:36

标签: windows-8 microsoft-metro windows-runtime sharing

我想在我的WinRT C#Metro应用程序(Windows Release Preview)中实现共享源合同。我的应用程序存储任意文件。不在文件系统中,而是通过WCF服务获取数据byte[]。现在我想在我的应用程序中共享这样的“文件”。

我使用标准数据格式看到的唯一可能是使用SetStorageItems()上的DataPackage方法。因此,我面临着将数据从我的字节数组转换为可以共享的StorageFile的挑战。我找到了StorageFile.CreateStreamedFileAsync()方法并希望以这种方式使用它:

// filename: string
// fileContent: byte[]

// ... setting DataPackage title and description ...

DataRequestDeferral deferral = args.Request.GetDeferral();

var file = await Windows.Storage.StorageFile.CreateStreamedFileAsync(filename,
    async stream => await stream.WriteAsync(fileContent.AsBuffer()), null);
args.Request.Data.SetStorageItems(new List<IStorageItem> { file });

deferral.Complete();

编译很好,但它没有按预期工作。我已尝试与标准邮件应用程序共享。邮件共享视图打开,我可以创建一个新邮件。显示的文件没有缩略图(如预期的那样),但无法发送电子邮件。它显示几分钟的发送进度,然后发生错误:“无法与Mail共享{filename}。”。分享魅力显示“出错了”和“[...] Mail现在无法分享。请稍后再试。”。

当我从文件系统加载StorageFile时,它工作正常:邮件打开并在几秒钟内发送,这里没有问题。所以要么我使用CreateStreamedFileAsync()错误,要么这个方法存在错误,您怎么看?

3 个答案:

答案 0 :(得分:1)

在传递给CreateStreamedFileAsync的回调中,您需要实际处理该对象 - 该信号将向操作系统发出信号。

写了一个完整的例子here

答案 1 :(得分:0)

Mail应用程序不是共享文件的目标。来自http://blogs.msdn.com/b/b8/archive/2012/06/14/building-the-mail-app.aspx:“邮件支持共享文字,链接和图片。”

请记住,共享合约有两部分:共享来源和共享目标。如您所知,可以在它们之间共享许多不同的数据格式,如文本,图片,URI和文件。支持的不同数据格式的完整列表位于http://msdn.microsoft.com/en-us/library/windows/apps/hh771179.aspx

我建议您使用“共享目标示例”应用程序来测试您的文件是否正确共享 - 与此共享它将显示从您的应用程序作为源共享的所有内容(并且它接受共享文件) 。您可以从http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782下载。您还可以使用Share Source Sample应用程序作为示例,并利用此应用程序中的代码;你可以从http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Source-App-d9bffd84下载它。

希望有所帮助!

答案 2 :(得分:0)

好吧,也许Mail应用的预览版本无法正确处理共享目标合同。使用来自http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782的SDK示例应用程序“共享内容目标应用程序”,使用上面发布的StorageFile.CreateStreamedFileAsync()方法共享在内存中创建的StorageItem工作正常。

因此,当您想要共享内存中的byte[]数组时,就应该采用这种方式。要进行测试,请确保当您想要与其他应用程序共享数据时,共享目标应用程序无法在Visual Studio中运行。然后神奇的共享侧边栏会自动消失......