Приложение UWP не копирует файл в папку AppData
Я сделал исполняемый файл 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);
}
Затем я создаю файл appxmanifest.xml, используя шаблон из этой статьи. Упакуйте приложение вручную. Я делаю пакет UWP с makeappx
а также signtool
, Но этот исполняемый файл не делает test
папку или скопировать test.txt
файл в папку AppData. Я не хочу делать это с проектом UWP в Visual Studio. Должен ли я добавить несколько дополнительных строк в файл appxmanifest.xml?
1 ответ
На самом деле приложение работает как задумано! Цель UWP Desktop Bridge - донести основные преимущества UWP до классических настольных приложений. Одним из таких преимуществ является безопасность и возможность простого удаления.
У классических настольных приложений была проблема с возможностью доступа к файлам в любом месте на диске и особенно с возможностью записи в любом месте без ведома пользователя. Удаление таких приложений оставляло после себя множество ненужных следов на жестком диске и в реестре, и компьютер постепенно становился все более и более загроможденным.
Цель приложений UWP заключается в том, что после их удаления они полностью исчезают, и на диске не остается следов.
Для этого UWP Desktop Bridge виртуализирует некоторые пути файловой системы. См. Раздел " Файловая система" в документации по Desktop Bridge, где вы можете прочитать следующее:
Чтобы содержать состояние приложения, мост пытается зафиксировать изменения, которые приложение вносит в AppData. Все записи в папку AppData пользователя (например, C:\Users\ имя_пользователя \AppData), включая создание, удаление и обновление, копируются при записи в частное местоположение для каждого пользователя для каждого приложения. Это создает иллюзию того, что упакованное приложение редактирует реальные данные AppData, когда оно фактически изменяет личную копию.
Записи, которые вы выполняли в своем коде, действительно работали, но они записывали не в папку AppData\Roaming, а в виртуализированный аналог этой папки, который вы можете найти в:
AppData\Local\Packages\{your app's ID}\LocalCache\Roaming\
Где идентификатор вашего приложения состоит из имени пакета и сгенерированного идентификатора. Обычно вы можете найти папку быстрее, отсортировав папки по дате изменения.
В папке LocalCache\Roaming вы найдете созданный вами файл test\test.txt. Если вы попытаетесь прочитать из этого файла, чтение снова будет виртуализировано из этого места.
Если вы хотите получить доступ к файлу, используя полный путь, вы можете получить его, используя StorageFile
API-интерфейсы:
var filePath = Path.Combine( ApplicationDate.Current.LocalCacheFolder.Path,
"Roamingtest\test.exe" ));
Однако для этого необходимо добавить ссылки на API-интерфейсы UWP. Это хорошо описано в этом посте.