Приложение UWP в VS2017 с файлами активов, для которых задано значение Build Content - всегда копировать не копируются в папку LocalState

При использовании Visual Studio 2017 для создания приложений UWP любые файлы ресурсов, которые я помечаю действием сборки «Содержимое» и устанавливаю «Всегда копировать» для свойства «Копировать в выходной каталог», копируются в соответствующие проекты \ Bin .. \ Папка отладочного проекта.

Но эти файлы не копируются в папку среды выполнения Local \ Packages .. \ LocalState и поэтому недоступны для приложения, если я попытаюсь прочитать их из ApplicationData.Current.LocalFolder.

Это ошибка Visual Studio или моей среды разработки? Или это умышленно? Если это сделано намеренно, каков рекомендуемый способ распределения папки, полной ресурсов или файлов данных с вашим приложением, которые вы можете перечислить во время выполнения?

Раньше я использовал

StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new System.Uri("ms-appx:///assets/xxx.png")); 

синтаксис, когда требуется доступ к определенному файлу или двум, но я ищу способ развернуть папку с файлами, которая может содержать файлы 1 ко многим, в зависимости от цели сборки, и мне бы не пришлось жестко кодировать длинный список файлов uri в приложение для каждого файла, а затем измените его при изменении файлов для специальной сборки.


person HoloSheep    schedule 17.01.2020    source источник


Ответы (2)


Копировать всегда не копируются в папку LocalState.

Возможно, вы неправильно понимаете функцию «Копировать в выходной каталог», она не будет выводиться в локальную папку.

Если вы хотите скопировать файлы в localFolder, вам нужно вручную скопировать. О том, как вручную копировать, файлы, для которых установлено «Копировать всегда», будут созданы в каталоге установки, вы можете перейти в соответствующую папку, чтобы найти файлы и использовать метод CopyAsync() для копирования в локальную папку.

person Faywang - MSFT    schedule 17.01.2020

После дальнейших раскопок я нашел то, что искал.

С точки зрения API кажется, что место, в которое файлы «Копировать в выходной каталог» помещаются, считается установленным местоположением пакета. Поэтому вместо того, чтобы пытаться перечислить файлы папки LocalState или ее подпапок, необходимо получить папку InstalledLocation и перечислить ее, чтобы получить доступ к файлам ресурсов, распространяемым с приложением.

Например:

StorageFolder installedFolder =  Windows.ApplicationModel.Package.Current.InstalledLocation;
StorageFolder assetsFolder = await installedFolder.GetFolderAsync("assets");
IReadOnlyList<StorageFile> pictures = await assetsFolder.GetFilesAsync();

будет способом получить доступ к папке Assets или любой другой подпапке Assets или к корню вашего проекта, если вы соответствующим образом измените параметр GetFolderAsync.

person HoloSheep    schedule 17.01.2020
comment
Мне все еще не ясно, почему я не вижу ни одного из этих файлов ресурсов ни в одном из подкаталогов локальной папки Package в проводнике файлов, если я перехожу к: '' 'C: \ Users \ - --- идентификатор пользователя --- \ AppData \ Local \ Packages \ --- packageid --- \ '' ' - person HoloSheep; 17.01.2020