如何使用FileSavePicker保存现有的StorageFile?

我正在尝试将现有文件保存到另一个地方。 这是某种副本,但我想允许用FileSavePicker为用户选择新目的地。 这是我的代码:

StorageFile currentImage = await StorageFile.GetFileFromPathAsync(item.UniqueId); var savePicker = new FileSavePicker(); savePicker.FileTypeChoices.Add("JPEG-Image",new List() { ".jpg"}); savePicker.FileTypeChoices.Add("PNG-Image", new List() { ".png" }); savePicker.SuggestedSaveFile = currentImage; savePicker.SuggestedFileName = currentImage.Name; var file = await savePicker.PickSaveFileAsync(); 

之后,将创建文件,但它为空(0 KB)。 如何正确保存文件?

我找到了解决方案,它与上面假设的有点不同。 它基于字节数组的复制和写入。

  var curItem = (SampleDataItem)flipView.SelectedItem; StorageFile currentImage = await StorageFile.GetFileFromPathAsync(curItem.UniqueId); byte[] buffer; Stream stream = await currentImage.OpenStreamForReadAsync(); buffer = new byte[stream.Length]; await stream.ReadAsync(buffer, 0, (int)stream.Length); var savePicker = new FileSavePicker(); savePicker.FileTypeChoices.Add("JPEG-Image",new List() { ".jpg"}); savePicker.FileTypeChoices.Add("PNG-Image", new List() { ".png" }); savePicker.SuggestedSaveFile = currentImage; savePicker.SuggestedFileName = currentImage.Name; var file = await savePicker.PickSaveFileAsync(); if (file != null) { CachedFileManager.DeferUpdates(file); await FileIO.WriteBytesAsync(file, buffer); CachedFileManager.CompleteUpdatesAsync(file); } 

为什么这种方式比StorageFile的CopyAsync()方法更好? StorageFile方法只允许将文件写入appxmanifest中指定的文件夹。 直接写入由PickSaveFileAsync()选择的文件允许在用户想要的任何地方创建文件(如果他当然具有对该文件夹的写入权限)。 我检查过这个确实有效。 希望,如果他们将面临这个问题,它将帮助其他开发人员。

您应该使用FolderPicker,请参阅http://lunarfrog.com/blog/2011/10/07/winrt-file-and-folder-pickers/ ,然后使用StorageFile的CopyAsync()或MoveAsync()方法。