我创建了一个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文件。我制作了一个包含makeappx
和signtool
的UWP包。但该可执行文件不会生成test
文件夹,也不会将test.txt
文件复制到AppData文件夹。我不想在Visual Studio中使用UWP项目。我应该在appxmanifest.xml文件中添加一些额外的行吗?
答案 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。