WINUI3打包应用:安装时本地复制指定文件夹/文件结构
实现MSIX安装时复制指定文件夹到本地临时路径的方案
1. 将目标文件夹纳入MSIX包内容
- 在Visual Studio的WINUI3项目中,右键点击
Folder 1,打开属性面板 - 把生成操作设为
Content,复制到输出目录设为始终复制,确保打包时该文件夹及其子文件、子目录会被完整包含进MSIX包
2. 获取应用的本地目标路径
通过Windows API获取对应AppData\Local\Packages\{你的应用ID}\temp\Folder 1的路径:
using Windows.Storage; using Windows.ApplicationModel; // 获取应用本地缓存根目录(对应AppData\Local\Packages\{AppID}\LocalCache) var localCache = ApplicationData.Current.LocalCacheFolder; // 创建/打开temp文件夹 var tempDir = await localCache.CreateFolderAsync("temp", CreationCollisionOption.OpenIfExists); // 创建/打开最终目标Folder 1 var targetFolder = await tempDir.CreateFolderAsync("Folder 1", CreationCollisionOption.OpenIfExists);
3. 从MSIX安装目录复制文件夹内容
MSIX安装目录是只读的,需递归读取其中的Folder 1内容,复制到目标路径:
// 获取MSIX包的安装目录 var installDir = Package.Current.InstalledLocation; // 定位包内的源Folder 1 var sourceFolder = await installDir.GetFolderAsync("Folder 1"); // 递归复制文件夹及所有内容的方法 async Task CopyFolderContent(StorageFolder source, StorageFolder target) { // 复制文件 foreach (var file in await source.GetFilesAsync()) { await file.CopyAsync(target, file.Name, NameCollisionOption.ReplaceExisting); } // 复制子文件夹 foreach (var subFolder in await source.GetFoldersAsync()) { var targetSubFolder = await target.CreateFolderAsync(subFolder.Name, CreationCollisionOption.OpenIfExists); await CopyFolderContent(subFolder, targetSubFolder); } } // 执行复制操作 await CopyFolderContent(sourceFolder, targetFolder);
4. 选择合适的执行时机
- 建议在程序首次启动时执行复制逻辑,比如在
App.xaml.cs的OnLaunched方法,或主页面的Loaded事件中 - 加个标记避免重复复制:
var localSettings = ApplicationData.Current.LocalSettings; if (!localSettings.Values.ContainsKey("HasCopiedFolder1") || !(bool)localSettings.Values["HasCopiedFolder1"]) { // 执行上述复制代码 localSettings.Values["HasCopiedFolder1"] = true; }
5. 权限与路径验证
- 应用的
LocalCache目录自带读写权限,无需额外申请 - 复制完成后,通过
targetFolder.Path即可获取完整本地路径,后续打开CANoe配置时直接使用该路径
内容的提问来源于stack exchange,提问作者CheckItOut
相关产品推荐
相关产品推荐

