更改FileSavePicker以保存文件FROM Isolated Storage而不是App storage。例外WP8.1

时间:2014-07-02 22:53:59

标签: c# windows-phone-8 isolatedstorage filesavepicker

使用var ...行更新了SoundData中的代码。我实际上已经看到要保存到现在的文件夹,但是当我尝试选择一个文件夹并保存到它时,我得到一个例外。

+ $ exception {System.IO.FileNotFoundException:系统找不到指定的文件。

这里是app.xaml.cs:

IStorageFile sourceFile = await folder.GetFileAsync(sourceFilePath);

App.xaml.cs:

private async void Application_ContractActivated(object sender, Windows.ApplicationModel.Activation.IActivatedEventArgs e)
    {
        var args = e as FileSavePickerContinuationEventArgs;
        if (args != null)
        {
            StorageFile file = args.File;
            if (file != null)
            {
                // Prevent updates to the remote version of the file until we finish making changes and call CompleteUpdatesAsync. 
                CachedFileManager.DeferUpdates(file);
                // write to file 
                var sourceFilePath = args.ContinuationData["SourceSound"].ToString();  
                StorageFolder folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
                StorageFile sourceFile = await folder.GetFileAsync(sourceFilePath);

                IRandomAccessStreamWithContentType sourceStream = await sourceFile.OpenReadAsync();

             var bytes = new byte[sourceStream.Size];

             var sourceBuffer = await sourceStream.ReadAsync(bytes.AsBuffer(), (uint)sourceStream.Size, Windows.Storage.Streams.InputStreamOptions.None);

                await FileIO.WriteBufferAsync(file, sourceBuffer);
                // Let Windows know that we're finished changing the file so the other app can update the remote version of the file. 
                // Completing updates may require Windows to ask for user input. 
                FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(file);
            }
        }
    }

SoundData ViewModel:

 private async void ExecuteSaveSoundAs(string soundPath)
    {

        var file = await ApplicationData.Current.LocalFolder.GetFileAsync(SavePath);

        FileSavePicker savePicker = new FileSavePicker();
        savePicker.SuggestedSaveFile = file;
        savePicker.FileTypeChoices.Add("MP3", new List<string>() { ".mp3" });
        savePicker.ContinuationData.Add("SourceSound", SavePath);
        savePicker.SuggestedFileName = this.Title;
        savePicker.PickSaveFileAndContinue();
    }


    public SoundData()
    {
        SaveSoundAs = new RelayCommand<string>(ExecuteSaveSoundAs);            
    }

SoundModel:

private SoundGroup CreateSoftwareGroup()
    {
        SoundGroup data = new SoundGroup();

        data.Title = "OS/Software";

        data.Items.Add(new SoundData
        {
            Title = "Test1",
            FilePath = "https://xxxxx.test1.mp3",
            Groups = "Test",
            SavePath = "Test1.mp3"
        });

        data.Items.Add(new SoundData
        {
            Title = "Test2",
            FilePath = "https://xxxxx.Test2.mp3",
            Groups = "Test",
            SavePath = "Test2.mp3"
        });

1 个答案:

答案 0 :(得分:0)

以下是解决方案:

修改了Mainpage.cs中的代码:

 var sourceFilePath = args.ContinuationData["SourceSound"].ToString();
                StorageFolder folder = ApplicationData.Current.LocalFolder;
                StorageFile sourceFile = await folder.GetFileAsync(sourceFilePath);

我的FileSavePicker代码:

private async void ExecuteSaveSoundAs(string soundPath)
    {

        var file = await ApplicationData.Current.LocalFolder.GetFileAsync(SavePath);

        FileSavePicker savePicker = new FileSavePicker();
        savePicker.SuggestedSaveFile = file;
        savePicker.FileTypeChoices.Add("MP3", new List<string>() { ".mp3" });
        savePicker.ContinuationData.Add("SourceSound", SavePath);
        savePicker.SuggestedFileName = this.Title;
        savePicker.PickSaveFileAndContinue();
    }