Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При создании приложений Windows с помощью пакета SDK для приложений Windows пользователи часто должны сохранять такие файлы, как документы, изображения или другое содержимое в определенных расположениях на устройстве. Пакет SDK для приложений Windows предоставляет класс FileSavePicker для создания согласованного пользовательского интерфейса, который позволяет пользователям выбирать место сохранения файлов и имя.
В этой статье показано, как реализовать средство выбора сохранения файлов в приложении WinUI. Вы узнаете, как настроить внешний вид и поведение средства выбора, обработать выбор пользователя и сохранить содержимое в выбранном расположении.
Средство выбора файлов сохранения можно заполнить предлагаемым именем файла и другими параметрами по умолчанию, чтобы упростить сохранение файлов пользователями:
Предпосылки
Прежде чем начать, убедитесь, что у вас есть:
- Проект WinUI, настроенный с помощью пакета SDK для приложений Windows
- Базовое знакомство с C# и XAML
- Общие сведения о шаблонах async/await в C#
Важные API
В этом разделе используются следующие API:
Используйте FileSavePicker , чтобы разрешить пользователям указать имя и расположение, в котором они хотят сохранить файл.
Сохранение документа с помощью FileSavePicker
Используйте FileSavePicker , чтобы пользователи могли указать имя, тип и расположение файла для сохранения. Создание, настройка и отображение объекта средства выбора файлов, а затем сохранение данных с помощью возвращаемого объекта StorageFile , представляющего выбранный файл.
Создайте и настройте FileSavePicker. Сначала создайте новый объект FileSavePicker , а затем задайте свойства объекта, чтобы настроить средство выбора файлов для приложения и пользователей:
using Microsoft.Windows.Storage.Pickers; ... var savePicker = new FileSavePicker(this.AppWindow.Id) { // (Optional) Specify the initial location for the picker. // If the specified location doesn't exist on the user's machine, it falls back to the DocumentsLibrary. // If not set, it defaults to PickerLocationId.Unspecified, and the system will use its default location. SuggestedStartLocation = PickerLocationId.DocumentsLibrary, // (Optional) specify the default file name. If not specified, use system default. SuggestedFileName = "My Document", // (Optional) Sets the folder that the file save dialog displays when it opens. // If not specified or the specified path doesn't exist, defaults to the last folder the user visited. SuggestedFolder = @"C:\MyFiles", // (Optional) specify the text displayed on the commit button. // If not specified, the system uses a default label of "Save" (suitably translated). CommitButtonText = "Save Document", // (Optional) categorized extension types. If not specified, "All Files (*.*)" is allowed. // Note that when "All Files (*.*)" is allowed, end users can save a file without an extension. FileTypeChoices = { { "Documents", new List<string> { ".txt", ".doc", ".docx" } } }, // (Optional) specify the default file extension (will be appended to SuggestedFileName). // If not specified, no extension will be appended. DefaultFileExtension = ".txt", };В этом примере задаются шесть свойств: SuggestedStartLocation, SuggestedFileName, SuggestedFolder, CommitButtonText, FileTypeChoices и DefaultFileExtension.
Так как пользователь сохраняет документ или текстовый файл, в примере SuggestedStartLocation устанавливается в папку библиотеки документов, используя значение DocumentsLibrary из перечисления PickerLocationId. Задайте для SuggestedStartLocation расположение, соответствующее типу сохраняемого файла, например "Музыка", "Изображения", "Видео" или "Документы". Из исходного расположения пользователь может перейти к другим расположениям и выбрать их.
Чтобы сократить ввод текста пользователем, в примере устанавливается SuggestedFileName. Предлагаемое имя файла должно быть соответствующим для сохраненного файла. Например, например Word, можно предложить существующее имя файла, если есть одно или первая строка документа, если пользователь сохраняет файл, который еще не имеет имени.
Используйте свойство FileTypeChoices при определении типов файлов, поддерживаемых примером (документы и текстовые файлы Microsoft Word). Это гарантирует, что приложение может открыть файл после его сохранения. Убедитесь, что все указанные типы файлов поддерживаются приложением. Пользователи смогут сохранить файл как любой из указанных типов файлов. Они также могут изменить тип файла, выбрав другой из указанных типов файлов. Первый выбор типа файла в списке будет выбран по умолчанию. Чтобы управлять этим, задайте свойство DefaultFileExtension .
Замечание
Средство выбора файлов также использует выбранный в данный момент тип для фильтрации, чтобы пользователю показывались только файлы, соответствующие выбранным типам.
Эквивалентный код C++ для этого примера выглядит следующим образом:
#include <winrt/Microsoft.Windows.Storage.Pickers.h> using namespace winrt::Microsoft::Windows::Storage::Pickers; FileSavePicker savePicker(AppWindow().Id()); // (Optional) Specify the initial location for the picker. // If the specified location doesn't exist on the user's machine, it falls back to the DocumentsLibrary. // If not set, it defaults to PickerLocationId.Unspecified, and the system will use its default location. savePicker.SuggestedStartLocation(PickerLocationId::DocumentsLibrary); // (Optional) specify the default file name. If not specified, use system default. savePicker.SuggestedFileName(L"NewDocument"); // (Optional) Sets the folder that the file save dialog displays when it opens. // If not specified or the specified path doesn't exist, defaults to the last folder the user visited. savePicker.SuggestedFolder = L"C:\\MyFiles", // (Optional) specify the text displayed on the commit button. // If not specified, the system uses a default label of "Save" (suitably translated). savePicker.CommitButtonText(L"Save Document"); // (Optional) categorized extension types. If not specified, "All Files (*.*)" is allowed. // Note that when "All Files (*.*)" is allowed, end users can save a file without an extension. savePicker.FileTypeChoices().Insert(L"Text", winrt::single_threaded_vector<winrt::hstring>({ L".txt" })); // (Optional) specify the default file extension (will be appended to SuggestedFileName). // If not specified, no extension will be appended. savePicker.DefaultFileExtension(L".txt");Замечание
Объекты FileSavePicker отображают средство выбора файлов с помощью режима представления PickerViewMode.List .
Затем давайте покажем FileSavePicker и сохранить в выбранное место. Отображение средства выбора файлов путем вызова PickSaveFileAsync. Когда пользователь указывает имя, тип файла и расположение, а также подтверждает сохранение файла, PickSaveFileAsync возвращает упрощенный объект FilePickResult , содержащий путь к сохраненном файлу и имени файла. Этот файл можно записать и обработать, если у вас есть доступ на чтение и запись.
using Microsoft.Windows.Storage.Pickers; ... var savePicker = new FileSavePicker(this.AppWindow.Id); var result = await savePicker.PickSaveFileAsync(); if (result != null) { if (!System.IO.File.Exists(result.Path)) { // Create a file and write to it. System.IO.File.WriteAllText(result.Path, "Hello world." + Environment.NewLine); } else { // Append to the existing file. System.IO.File.AppendAllText(result.Path, "Hello again." + Environment.NewLine); } } else { this.textBlock.Text = "Operation cancelled."; }В примере проверяется, существует ли файл и создается новый файл или добавляется к существующему файлу. Если пользователь отменяет операцию, результат будет
null, и вы можете должным образом обработать этот случай, например, отобразить сообщение пользователю.Подсказка
Перед выполнением любой другой обработки всегда следует проверить сохраненный файл, чтобы убедиться, что он существует и является допустимым. Затем вы можете сохранить содержимое в файл в соответствии с вашим приложением. Приложение должно обеспечить соответствующее поведение, если выбранный файл недействителен.
Ниже приведен эквивалент C++ этого примера C#:
#include <winrt/Microsoft.Windows.Storage.Pickers.h> #include <fstream> #include <string> using namespace winrt::Microsoft::Windows::Storage::Pickers; FileSavePicker savePicker(AppWindow().Id()); auto result{ co_await savePicker.PickSaveFileAsync() }; if (result) { // Check if the file exists. if (!std::ifstream(result.Path().c_str())) { std::ofstream outFile(result.Path().c_str()); outFile << "Hello world."; outFile.close(); } else { // Append to the existing file. std::ofstream outFile(result.Path().c_str(), std::ios::app); outFile << "Hello again."; outFile.close(); } } else { textBlock().Text(L"Operation cancelled."); }
Связанный контент
Файлы, папки и библиотеки с помощью пакета SDK для приложений Windows
Windows developer