Compartir a través de


Guardar un archivo con el selector de Windows App SDK en WinUI

Al compilar aplicaciones de Windows con Windows App SDK, los usuarios a menudo necesitan guardar archivos como documentos, imágenes u otro contenido en ubicaciones específicas de su dispositivo. El SDK de aplicaciones de Windows proporciona la clase FileSavePicker para crear una interfaz coherente y fácil de usar que permita a los usuarios elegir dónde guardar archivos y qué asignarles el nombre.

En este artículo se muestra cómo implementar un selector de guardado de archivos en la aplicación WinUI. Aprenderá a configurar la apariencia y el comportamiento del selector, controlar la selección del usuario y guardar el contenido en la ubicación elegida.

El selector de archivos de guardado se puede rellenar con un nombre de archivo sugerido y otra configuración predeterminada para facilitar a los usuarios guardar sus archivos:

Captura de pantalla de un selector de archivos de guardado con un nombre de archivo sugerido

Prerrequisitos

Antes de empezar, asegúrese de que tiene:

  • Un proyecto de WinUI configurado con Windows App SDK
  • Conocimientos básicos de C# y XAML
  • Comprensión de los patrones async/await en C#

API importantes

En este tema se usan las SIGUIENTES API:

Usa FileSavePicker para permitir a los usuarios especificar el nombre y la ubicación donde quieren que la aplicación guarde un archivo.

Guardar un documento con FileSavePicker

Use un FileSavePicker para que los usuarios puedan especificar el nombre, el tipo y la ubicación de un archivo que se va a guardar. Cree, personalice y muestre un objeto de selector de archivos y guarde los datos a través del objeto StorageFile devuelto que representa el archivo seleccionado.

  1. Cree y personalice fileSavePicker. Empiece por crear un nuevo objeto FileSavePicker y, a continuación, establezca las propiedades en el objeto para personalizar el selector de archivos para la aplicación y los usuarios:

    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",
    };
    

    En este ejemplo se establecen seis propiedades: SuggestedStartLocation, SuggestedFileName, SuggestedFolder, CommitButtonText, FileTypeChoices y DefaultFileExtension.

    Dado que el usuario guarda un documento o un archivo de texto, el ejemplo establece SuggestedStartLocation en la carpeta de la biblioteca de documentos mediante el valor DocumentsLibrary de pickerLocationId Enum. Establezca SuggestedStartLocation en una ubicación adecuada para el tipo de archivo que se va a guardar, por ejemplo Música, Imágenes, Vídeos o Documentos. Desde la ubicación inicial, el usuario puede navegar y seleccionar otras ubicaciones.

    Para ahorrar al usuario algo de tecleo, en el ejemplo se establece SuggestedFileName. El nombre de archivo sugerido debe ser relevante para el archivo que se va a guardar. Por ejemplo, como Word, puede sugerir el nombre de archivo existente si hay uno o la primera línea de un documento si el usuario guarda un archivo que aún no tiene un nombre.

    Use la propiedad FileTypeChoices al especificar los tipos de archivo que admite el ejemplo (documentos de Microsoft Word y archivos de texto). Esto garantiza que la aplicación pueda abrir el archivo después de guardarlo. Asegúrese de que la aplicación admite todos los tipos de archivo que especifique. Los usuarios podrán guardar su archivo como cualquiera de los tipos de archivo que especifique. También pueden cambiar el tipo de archivo seleccionando otro de los tipos de archivo que especificó. La primera opción de tipo de archivo de la lista se seleccionará de forma predeterminada. Para controlarlo, establezca la propiedad DefaultFileExtension .

    Nota:

     El selector de archivos también usa el tipo de archivo seleccionado actualmente para filtrar los archivos que muestra, de modo que solo se muestren los tipos de archivo que coincidan con los tipos de archivos seleccionados al usuario.

    El código de C++ equivalente para este ejemplo es el siguiente:

    #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");
    

    Nota:

      Los objetos FileSavePicker muestran el selector de archivos mediante el modo de vista PickerViewMode.List .

  2. A continuación, se mostrará FileSavePicker y se guardará en la ubicación del archivo seleccionado. Para mostrar el selector de archivos, llame a PickSaveFileAsync. Después de que el usuario especifique el nombre, el tipo de archivo y la ubicación, y confirme que guarda el archivo, PickSaveFileAsync devuelve un objeto FilePickResult ligero que contiene la ruta de acceso al archivo guardado y el nombre de archivo. Puede capturar y procesar este archivo si tiene acceso de lectura y escritura a él.

    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.";
    }
    

    En el ejemplo se comprueba si el archivo existe y se crea un nuevo archivo o se anexa al archivo existente. Si el usuario cancela la operación, el resultado será nully puede controlar ese caso adecuadamente, como mostrar un mensaje al usuario.

    Sugerencia

     Siempre debe comprobar el archivo guardado para asegurarse de que existe y es válido antes de realizar cualquier otro procesamiento. A continuación, puedes guardar contenido en el archivo según corresponda para tu aplicación. La aplicación debe proporcionar un comportamiento adecuado si el archivo seleccionado no es válido.

    Este es el equivalente de C++ de este ejemplo de 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.");
    }
    

Windows.Storage.Pickers

Archivos, carpetas y bibliotecas con Windows App SDK

PickSaveFileAsync