Delen via


Een bestand opslaan met Windows App SDK-kiezer in WinUI

Bij het bouwen van Windows-apps met Windows App SDK moeten gebruikers vaak bestanden zoals documenten, afbeeldingen of andere inhoud opslaan op specifieke locaties op hun apparaat. De Windows App SDK biedt de klasse FileSavePicker om een consistente, gebruiksvriendelijke interface te maken waarmee gebruikers kunnen kiezen waar ze bestanden moeten opslaan en wat ze een naam moeten geven.

In dit artikel leest u hoe u een kiezer voor het opslaan van bestanden implementeert in uw WinUI-app. U leert hoe u het uiterlijk en gedrag van de kiezer configureert, de selectie van de gebruiker afhandelt en inhoud opslaat op de gekozen locatie.

De bestandskiezer voor opslaan kan worden gevuld met een voorgestelde bestandsnaam en andere standaardinstellingen, zodat gebruikers hun bestanden gemakkelijker kunnen opslaan:

Een schermopname van een kiezer voor het opslaan van bestanden met de voorgestelde bestandsnaam 'Mijn document' en het bestandstype 'Documenten' (.txt, .doc, .docx).

Vereiste voorwaarden

Voordat u begint, moet u ervoor zorgen dat u het volgende hebt:

  • Een WinUI-project dat is ingesteld met Windows App SDK
  • Basiskennis van C# en XAML
  • Inzicht in async/await-patronen in C#

Belangrijke API's

De volgende API's worden in dit onderwerp gebruikt:

Gebruik FileSavePicker om gebruikers de naam en locatie op te geven waar ze een bestand willen opslaan.

Een document opslaan met FileSavePicker

Gebruik een FileSavePicker zodat uw gebruikers de naam, het type en de locatie van een bestand kunnen opgeven dat moet worden opgeslagen. Maak, pas een bestandkiezerobject aan en sla gegevens op via het geretourneerde StorageFile-object dat het geselecteerde bestand vertegenwoordigt.

  1. De FileSavePicker maken en aanpassen. Maak eerst een nieuw FileSavePicker-object en stel vervolgens eigenschappen in voor het object om de bestandskiezer voor uw app en uw gebruikers aan te passen:

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

    In dit voorbeeld worden zes eigenschappen ingesteld: SuggestedStartLocation, SuggestedFileName, SuggestedFolder, CommitButtonText, FileTypeChoices en DefaultFileExtension.

    Omdat de gebruiker een document of tekstbestand opslaat, stelt het voorbeeld de SuggestedStartLocation in op de map documentenbibliotheek met behulp van de waarde DocumentsLibrary uit de PickerLocationId Enum. Stel de SuggestedStartLocation in op een locatie die geschikt is voor het type bestand dat wordt opgeslagen, bijvoorbeeld Muziek, Afbeeldingen, Video's of Documenten. Vanaf de beginlocatie kan de gebruiker naar andere locaties navigeren en selecteren.

    Om de gebruiker wat typewerk te besparen, stelt het voorbeeld een SuggestedFileName in. De voorgestelde bestandsnaam moet relevant zijn voor het bestand dat wordt opgeslagen. U kunt bijvoorbeeld, zoals Word, de bestaande bestandsnaam voorstellen als er een is, of de eerste regel van een document als de gebruiker een bestand opslaat dat nog geen naam heeft.

    Gebruik de eigenschap FileTypeChoices bij het specificeren van de bestandstypen die het voorbeeld ondersteunt (Microsoft Word-documenten en tekstbestanden). Dit zorgt ervoor dat de app het bestand kan openen nadat het is opgeslagen. Zorg ervoor dat alle bestandstypen die u opgeeft, worden ondersteund door uw app. Gebruikers kunnen hun bestand opslaan als een van de bestandstypen die u opgeeft. Ze kunnen ook het bestandstype wijzigen door een ander bestandstype te selecteren dat u hebt opgegeven. De eerste keuze van het bestandstype in de lijst wordt standaard geselecteerd. Als u dit wilt beheren, stelt u de eigenschap DefaultFileExtension in.

    Opmerking

     De bestandskiezer gebruikt ook het geselecteerde bestandstype om te filteren welke bestanden worden weergegeven, zodat alleen bestandstypen die overeenkomen met de geselecteerde bestandstypen worden weergegeven aan de gebruiker.

    De equivalente C++-code voor dit voorbeeld is als volgt:

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

    Opmerking

      FileSavePicker-objecten geven de bestandskiezer weer met behulp van de weergavemodus PickerViewMode.List .

  2. Laten we vervolgens FileSavePicker weergeven en opslaan op de geselecteerde bestandslocatie. Geef de bestandskiezer weer door PickSaveFileAsync aan te roepen. Nadat de gebruiker de naam, het bestandstype en de locatie heeft opgegeven en bevestigt dat het bestand moet worden opgeslagen, retourneert PickSaveFileAsync een lichtgewicht FilePickResult-object dat het pad naar het opgeslagen bestand en de bestandsnaam bevat. U kunt dit bestand vastleggen en verwerken als u lees- en schrijftoegang tot het bestand hebt.

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

    In het voorbeeld wordt gecontroleerd of het bestand bestaat en er wordt een nieuw bestand gemaakt of toegevoegd aan het bestaande bestand. Als de gebruiker de bewerking annuleert, wordt het resultaat weergegeven nullen kunt u dat geval op de juiste manier afhandelen, zoals het weergeven van een bericht aan de gebruiker.

    Aanbeveling

     Controleer altijd het opgeslagen bestand om ervoor te zorgen dat het bestaat en geldig is voordat u andere verwerkingen uitvoert. Vervolgens kunt u inhoud opslaan in het bestand, indien van toepassing op uw app. Uw app moet het juiste gedrag bieden als het gekozen bestand niet geldig is.

    Dit is het C++-equivalent van dit C#-voorbeeld:

    #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

Bestanden, mappen en bibliotheken met Windows App SDK

PickSaveFileAsync