【问题标题】:UWP app does not copy file to AppData folderUWP 应用程序不会将文件复制到 AppData 文件夹
【发布时间】:2018-07-28 16:18:15
【问题描述】:

我创建了一个 C# 可执行文件,它创建了一个 test 文件夹并将 test.txt 文件从它的执行文件夹复制到 AppData 文件夹。这是我的代码:

static void Main() 
{
    string fullPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\test";
    string destination = $"{fullPath}\\test.txt";

    Directory.CreateDirectory(fullPath);
    string location = System.Reflection.Assembly.GetExecutingAssembly().Location;
    int index = location.LastIndexOf("\\");
    string source = $"{location.Substring(0, index)}\\test.txt";
    File.Copy(source, destination);
}

然后我使用本文Package an app manually 中的模板制作appxmanifest.xml 文件。我用makeappxsigntool 制作了一个UWP 包。但该可执行文件不会创建test 文件夹,也不会将test.txt 文件复制到AppData 文件夹。我不想在 Visual Studio 中使用 UWP 项目。我应该在 appxmanifest.xml 文件中添加一些额外的行吗?

【问题讨论】:

    标签: uwp desktop-bridge


    【解决方案1】:

    实际上,该应用程序按预期工作! UWP 桌面桥的目标是将 UWP 的主要优势带入经典桌面应用程序。其中一项好处是安全性和轻松卸载的能力。

    经典桌面应用程序存在无法访问磁盘上任何位置的文件的问题,尤其是能够在用户不知情的情况下在任何位置写入。卸载此类应用程序后在硬盘驱动器和注册表中留下了许多不必要的痕迹,PC 逐渐变得越来越杂乱。

    UWP 应用的目标是当它们被卸载时,它们完全消失,在磁盘上不留痕迹。

    为了实现这一点,UWP 桌面桥虚拟化了一些文件系统路径。请参阅 Desktop Bridge 文档中的File System section,您可以在其中阅读以下内容:

    为了包含应用状态,网桥会尝试捕获应用对 AppData 所做的更改。所有写入用户的 AppData 文件夹(例如,C:\Users\user_name\AppData),包括创建、删除和更新,都会在写入时复制到每个用户、每个应用程序的私有位置。这会产生一种错觉,即打包的应用在实际修改私有副本时正在编辑真实的 AppData。

    您在代码中执行的写入确实有效,但它们并未写入 AppData\Roaming 文件夹,而是写入此文件夹的虚拟化副本,您可以在以下位置找到该文件夹​​:

    AppData\Local\Packages\{your app's ID}\LocalCache\Roaming\
    

    您的应用 ID 由包名称和生成的 ID 组成。您通常可以通过按修改日期对文件夹进行排序来更快地找到文件夹。

    LocalCache\Roaming 文件夹中,您将找到您创建的 test\test.txt 文件。如果您尝试从该文件读取,读取将再次从该位置虚拟化。

    如果您想使用完整路径访问文件,可以使用StorageFile API 检索它:

    var filePath = Path.Combine( ApplicationDate.Current.LocalCacheFolder.Path, 
              "Roamingtest\test.exe" ));
    

    不过,这样做的先决条件是添加对 UWP API 的引用。这很好描述in this blogpost

    【讨论】:

    • 进入变量是什么意思?如果要获取该目标文件夹的完整路径,可以使用 UWP StorageFile API:ApplicationData.Current.LocalCacheFolder.Path
    • System.Diagnostics 的具体情况如何?您应该可以同时使用两者而不会出现问题,但我不知道您的具体情况:-)
    • 获得文件路径(如var filePath = Path.Combine( ApplicationDate.Current.LocalCacheFolder.Path, "Roamingtest\test.exe" ))后,您可以尝试使用Process.Start 启动文件。但是,由于 UWP 桌面桥的沙盒限制,我不确定它是否会起作用
    • 查看这篇文章,了解如何在桌面桥应用程序中访问 Windows 10 API blogs.windows.com/buildingapps/2017/01/25/…
    • 太棒了:-)。编码愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多