VS2017 中的 UWP 应用程序,资产文件设置为构建内容 - 始终复制不会复制到 LocalState 文件夹

UWP app in VS2017 with Asset files set to Build Content - Copy Always are not copied to LocalState folder

当使用 Visual Studio 2017 构建 UWP 应用程序时,我使用 "Content" 构建操作标记并为 "Copy to Output directory" [=28] 设置 "Copy Always" 的任何资产文件=] 被复制到相应的项目 \Bin ..\Debug 项目文件夹。

但是这些文件没有被复制到运行时 Local\Packages ..\LocalState 文件夹,因此如果我尝试从 ApplicationData.Current.LocalFolder.

这是 Visual Studio 中的错误还是我的开发环境中的错误?或者这是设计使然? 如果是设计使然,建议使用什么方法来分发一个充满资产或数据文件的文件夹以及您可以在运行时枚举的应用程序?

以前我用过

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

需要访问一个或两个特定文件时的语法,但我正在寻找一种方法来部署可能包含一对多文件的文件夹,具体取决于构建的目的,而不希望有为每个文件将一长串文件 uri 硬编码到应用程序中,然后在为特殊构建更改文件时更改它。

Copy Always are not copied to LocalState folder.

可能你对'Copy to Output directory'的功能理解有误,不会输出到本地文件夹。

如果要将文件复制到localFolder,需要手动复制。关于如何手动复制,在安装目录下会生成设置了"Copy Always"的文件,你可以到对应的文件夹中找到文件,使用CopyAsync()的方式复制到本地文件夹。

进一步挖掘后,我找到了我要找的东西。

从 API 的角度来看,"Copy to Output directory" 放置文件的位置似乎被认为是包的 InstalledLocation。因此,与其尝试枚举 LocalState 文件夹或其子文件夹的文件,不如检索 InstalledLocation 文件夹并枚举它,以便访问随应用程序分发的资产文件。

例如:

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

如果相应地调整 GetFolderAsync 参数,这将是访问资产文件夹或资产的任何其他子文件夹或项目根目录的方式。