Как сохранить папку из FolderPicker в StorageFolder?

Когда я пытаюсь сделать это:

        folderPicker = new FolderPicker();
        folderPicker.SuggestedStartLocation = PickerLocationId.Desktop;
        folderPicker.FileTypeFilter.Add(".txt");
        StorageFolder folder = await folderPicker.PickSingleFolderAsync();

это покажет мне ошибку:

Ошибка 2 Оператор 'await' может использоваться только внутри асинхронного метода. Попробуйте пометить этот метод модификатором async и изменить его тип возвращаемого значения на Task. C:\Users\Lukasz\Documents\Visual Studio 2012\Projects\RobimyProjekt\RobimyProjekt\ImageBrowser.xaml.cs.

Когда я удалил "жду", он показывает мне еще одну ошибку:

Ошибка 2 Не удается неявно преобразовать тип "Windows.Foundation.IAsyncOperation" в "Windows.Storage.StorageFolder" C:\Users\Lukasz\Documents\Visual Studio 2012\Projects\RobimyProjekt\RobimyProjekt\ImageBrowser.xaml.cs 61 36 RobimyProjekt.

В чем дело? Этот код из MSDN и я использую Visual Studio 2012.

3 ответа

Попробуй это. Вы должны использовать ключевое слово async для ожидания.

private async void pickFolder(object sender, RoutedEventArgs e)
{
    folderPicker = new FolderPicker();
    folderPicker.SuggestedStartLocation = PickerLocationId.Desktop;
    folderPicker.ViewMode = PickerViewMode.List;
    folderPicker.FileTypeFilter.Add(".txt");
    StorageFolder folder = await folderPicker.PickSingleFolderAsync();
    if(folder != null)
    {
         StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", folder);
    }

}

Ниже работал для меня. Мне понадобилось несколько дней, чтобы понять это; но для моего собственного учебного проекта я хотел посмотреть, смогу ли я создать папку, файл, а затем прочитать из него. Я смог создать папку по указанному пути, выполнив следующие действия.

Конечно, я передаю объект Textbox в качестве параметра; но, несмотря на это, следующее работает для меня, когда я пытаюсь создать папку, используя FolderPicker и StorageFolder,

public static async Task<string> createDirectory(TextBox parmTextBox)
{
    string folderName = parmTextBox.Text.Trim();

    // Section: Allows the user to choose their folder.
    FolderPicker fpFolder = new FolderPicker();
    fpFolder.SuggestedStartLocation = PickerLocationId.Desktop;
    fpFolder.ViewMode = PickerViewMode.Thumbnail;
    fpFolder.FileTypeFilter.Add("*");
    StorageFolder sfFolder = await fpFolder.PickSingleFolderAsync();

    if (sfFolder.Name != null)
    {
        // Gives the StorageFolder permissions to modify files in the specified folder.
        Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.AddOrReplace("CSharp_Temp", sfFolder);

        // creates our folder
        await sfFolder.CreateFolderAsync(folderName);

        // returns a string of our path back to the user
        return string.Concat(sfFolder.Path, @"\", folderName); 
    }
    else
    {
        MessageDialog msg = new MessageDialog("Need to choose a folder.");
        await msg.ShowAsync();
        return "Error: Choose new folder.";
    }
}

Измените это на

private async void (pickFolder(object sender, RoutedEventArgs e)

Прослушивание совета в сообщении об ошибке также может быть хорошей идеей:

Попробуйте пометить этот метод модификатором async и изменить его тип возвращаемого значения на Task.

Task возвращаемый тип делает метод "ожидаемым".

void Решение, предложенное в других ответах, тоже работает, но дает решение "запусти и забудь". Рекомендуемая практика - возвращать Task так что если вызывающий объект желает что-то сделать, например, с исключениями, возникающими из вашего метода, это возможно.

Цитировать с http://msdn.microsoft.com/en-us/magazine/jj991977.aspx:

"Чтобы суммировать это первое руководство, вы должны предпочесть async Task асинхронному void. Методы Async Task обеспечивают более простую обработку ошибок, возможность компоновки и тестируемости".

Другие вопросы по тегам