2

既存のファイルを別の場所に保存しようとしています。ある種のコピーですが、FileSavePicker でユーザーが新しい保存先を選択できるようにしたいと考えています。これが私のコードです:

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

その後、ファイルが作成されますが、空 (0 KB) です。ファイルを正しく保存するには?

4

2 に答える 2

3

解決策を見つけましたが、上記の推定とは少し異なります。これは、バイト配列のコピーと書き込みに基づいています。

        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<string>() { ".jpg"});
        savePicker.FileTypeChoices.Add("PNG-Image", new List<string>() { ".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() によって選択されたファイルへの直接書き込みにより、ユーザーが必要な任意の場所にファイルを作成できます (もちろん、そのフォルダーへの書き込みアクセス権がある場合)。これを確認しましたが、実際に機能します。他の開発者がこの問題に直面した場合に役立つことを願っています。

于 2013-07-10T16:42:59.200 に答える
0

このhttp://lunarfrog.com/blog/2011/10/07/winrt-file-and-folder-pickers/ を参照して FolderPicker を使用し、StorageFile の CopyAsync() または MoveAsync() メソッドを使用する必要があります。

于 2013-07-10T15:08:19.370 に答える