Изображения/файлы не отображаются при упаковке моего приложения WINUI3

У меня есть приложение WINUI 3, в которое я добавил несколько собственных текстовых файлов/фотографий. Однако, когда я упаковываю приложение и загружаю exe через пакет, оно пытается загрузить эти файлы из C:\Program Files\WindowsApps\PackageName\FilePath. Что по праву дает ему отказ в доступе.

Код:

public static string ProjBaseDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
public static string CountriesListPath = Path.Combine(ProjBaseDirectory, @"Assets\Contents\Docs\Countries.txt");

Выше показано, как я пытаюсь получить доступ к большинству файлов, и путь, который я получаю при отладке, таков: C:\user\Projects\iAssist\iAssist\bin\x64\Debug\net6.0-windows10.0.19041.0\win10-x64\AppX\Assets\Contents\Docs\Countries.txt

Но та же строка дает мне путь к C:\Program Files\WindowsApps\PackageName\FilePath при упаковке.

Свойства: Другие свойства файлов/изображений имитируют это.

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

Спасибо!

Для упакованных приложений следует использовать упакованные/встроенные ресурсы вместо прямого доступа к файлам для ресурсов приложения: Learn.Microsoft.com/en-us/windows/apps/windows-app-sdk/mrtco‌​re/…

Simon Mourier 12.04.2023 15:13

@SimonMourier Спасибо! Это было очень полезно, но похоже, что установка действия сборки на встроенные ресурсы не позволяет манипулировать данными внутри файла. В моем случае у меня есть файл Json, который я время от времени обновляю во время выполнения, есть ли способ, который позволит мне добиться этого?

Anynomus 12.04.2023 16:59

Ресурсы не предназначены для записи. Для этого вы должны использовать Windows.Storage.ApplicationData (чтобы вы могли копировать из ресурса в данные приложения, а затем обновлять оттуда)

Simon Mourier 12.04.2023 18:20

Неудивительно, что активы не могут быть изменены во время выполнения. Кроме того, интерфейсы управления ресурсами не экспортируют такие функции. Персональные данные приложения должны быть способны на это, как сказал @SimonMourier. Любое обновление?

YangXiaoPo-MSFT 14.04.2023 04:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Позвольте мне показать вам пример, основанный на комментарии @Simon Mourier о Windows.Storage.ApplicationData.

В этом примере я добавил текстовый файл SomeText.txt в папку Assets в проекте.

MainPage.xaml

<Page
    x:Class = "WindowsStorageApplicationDataExample.MainPage"
    xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local = "using:WindowsStorageApplicationDataExample"
    xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
    Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}"
    mc:Ignorable = "d">

    <Grid RowDefinitions = "Auto,Auto,*">
        <Button
            Grid.Row = "0"
            Click = "InitializeButton_Click"
            Content = "Initialize" />
        <Button
            Grid.Row = "1"
            Click = "UpdateSomeTextButton_Click"
            Content = "Update SomeText.txt" />
        <ItemsRepeater
            Grid.Row = "2"
            ItemsSource = "{x:Bind Logs}" />
    </Grid>
</Page>

MainPage.xaml.cs

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using System;
using System.Collections.ObjectModel;
using Windows.ApplicationModel;
using Windows.Storage;

namespace WindowsStorageApplicationDataExample;

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    public ObservableCollection<string> Logs { get; } = new();

    private StorageFile? SomeTextInLocalStateFolderFile { get; set; }

    private async void InitializeButton_Click(object sender, RoutedEventArgs e)
    {
        StorageFolder installedLocationFolder = Package.Current.InstalledLocation;
        Logs.Add($"InstalledLocation: {installedLocationFolder.Path}");

        StorageFolder assetsFolder = await installedLocationFolder.GetFolderAsync("Assets");
        Logs.Add($"Assets folder: {assetsFolder.Path}");

        StorageFile someTextFile = await assetsFolder.GetFileAsync("SomeText.txt");
        Logs.Add($"SomeText.txt file: {someTextFile.Path}");

        StorageFolder localStateFolder = ApplicationData.Current.LocalFolder;
        Logs.Add($"LocalState folder: {localStateFolder.Path}");

        if (await localStateFolder.TryGetItemAsync("SomeText.txt") is StorageFile someTextInLocalStateFolderFile)
        {
            Logs.Add($"SomeText.txt file exists: {someTextInLocalStateFolderFile.Path}");
            SomeTextInLocalStateFolderFile = someTextInLocalStateFolderFile;
        }
        else
        {
            Logs.Add($"SomeText.txt file not found in {localStateFolder.Path}");
            SomeTextInLocalStateFolderFile = await someTextFile.CopyAsync(localStateFolder);
            Logs.Add($"SomeText.txt file created: {SomeTextInLocalStateFolderFile.Path}");
        }
    }

    private async void UpdateSomeTextButton_Click(object sender, RoutedEventArgs e)
    {
        if (SomeTextInLocalStateFolderFile is null)
        {
            Logs.Add("Not initialized.");
            return;
        }

        string someTextInLocalStateFolder = await FileIO.ReadTextAsync(SomeTextInLocalStateFolderFile);
        someTextInLocalStateFolder += Environment.NewLine + DateTime.Now;
        Logs.Add($"SomeText.txt in LocalStateFolder updated to: {someTextInLocalStateFolder}");
        await FileIO.WriteTextAsync(SomeTextInLocalStateFolderFile, someTextInLocalStateFolder);
    }
}

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