У меня есть приложение 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
при упаковке.
Свойства: Другие свойства файлов/изображений имитируют это.
Я пробовал несколько решений, например пробовал разные варианты действия сборки для свойств файлов, но, похоже, ничего не работает. Есть ли какое-либо решение этой проблемы, любая помощь будет высоко оценена, я застрял в этой проблеме уже два дня.
Спасибо!
@SimonMourier Спасибо! Это было очень полезно, но похоже, что установка действия сборки на встроенные ресурсы не позволяет манипулировать данными внутри файла. В моем случае у меня есть файл Json, который я время от времени обновляю во время выполнения, есть ли способ, который позволит мне добиться этого?
Ресурсы не предназначены для записи. Для этого вы должны использовать Windows.Storage.ApplicationData (чтобы вы могли копировать из ресурса в данные приложения, а затем обновлять оттуда)
Неудивительно, что активы не могут быть изменены во время выполнения. Кроме того, интерфейсы управления ресурсами не экспортируют такие функции. Персональные данные приложения должны быть способны на это, как сказал @SimonMourier. Любое обновление?
Позвольте мне показать вам пример, основанный на комментарии @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);
}
}
Для упакованных приложений следует использовать упакованные/встроенные ресурсы вместо прямого доступа к файлам для ресурсов приложения: Learn.Microsoft.com/en-us/windows/apps/windows-app-sdk/mrtcore/…