UWP应用程序不会将文件复制到AppData文件夹

时间:2018-02-18 06:27:24

标签: uwp desktop-bridge project-centennial

我创建了一个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文件中添加一些额外的行吗?

1 个答案:

答案 0 :(得分:2)

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

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

UWP应用的目标是,当它们被卸载时,它们完全,磁盘上没有任何痕迹。

为此,UWP Desktop Bridge虚拟化了一些文件系统路径。请参阅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