Как сохранить папку из 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 обеспечивают более простую обработку ошибок, возможность компоновки и тестируемости".