Приложение 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. Это хорошо описано в этом посте.

Другие вопросы по тегам