Папка CommonApplicationData только для чтения после использования MSIX Packaging Tool - PullRequest
0 голосов
/ 28 января 2020

Я написал приложение. Net Windows, которое использует общую папку данных приложения для хранения файлов журналов и учетных записей пользователей. Приложение распространяется с использованием проекта Install Shield и отлично работает на всех различных Windows версиях.

Некоторые части кода из разных файлов показаны ниже

// Defining the path to use (in ProductInfo class)
public static string CommonApplicationDataPath
{
    get
    {
        string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
        path = StringHelper.EnsureEndsWithSlash(path);
        path += Vendor + @"\" + ProductName + @"\";

        return path;
    }
}

// Configuring the logger and user manager instances at startup
Logger.Configure(string.Empty, ProductInfo.Password, ProductInfo.CommonApplicationDataPath);
UserManager.Configure(User.Empty, ProductInfo.Password, ProductInfo.CommonApplicationDataPath, 
    ProductInfo.UserLimitCount);

// Example method for saving the users to file (in UserManager class)
public bool SaveUsers(AppUsers appUsers)
{
    AppUsersSerializer serializer = new AppUsersSerializer(_password, _fileName);

    if (serializer.Serialize(appUsers) == true)
    {
        return true;
    }
    else
    {
        Logger.Instance.Log(Logs.ErrorB.UserSave, _fileName);
        return false;
    }
}

Я хотел бы сейчас опубликовать sh приложение через Windows Store и использовать MSIX Packaging Tool. Чтобы подписать пакет, я создал самозаверяющий сертификат и добавил его в доверенные Root центры сертификации. Пакет .msix устанавливается на тот же P C, что и моя старая версия приложения для настольного компьютера.

У меня проблема в том, что приложение не может записывать в файлы, расположенные в CommonApplicationData папки. Приложение может считывать и загружать данные, но не обновлять и не записывать изменения в файлы. Таким образом, путь к файлам правильный, но некоторые права на запись отсутствуют. Я пробовал разные возможности пакета и даже отмечал все, но без какого-либо эффекта.

Я также просмотрел папку C:\Program Files\WindowsApps\<my app package>\, проверил структуру приложения и обнаружил файлы. Они есть, но только для чтения для приложения. Удаление файлов не приведет к созданию новых, когда они должны быть добавлены, как это было сделано в старой версии Windows Forms для рабочего стола.

Приложение довольно большое и содержит множество функций, которые прекрасно работают в контексте приложения Windows Store. Единственный недостающий фрагмент - это вышеупомянутые проблемы с записью файла.

Любой совет будет очень признателен.

Ответы [ 3 ]

1 голос
/ 30 января 2020

После продолжительного поиска на разных веб-сайтах я наткнулся на жизнеспособное решение для моей проблемы.

В блоге Microsoft MSDN описано, как правильно использовать разные папки.

http://blogs.msdn.microsoft.com/appconsult/2017/03/06/handling-data-in-a-converted-desktop-app-with-the-desktop-bridge/

Предлагаемое решение заключается в изменении:

string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);

на:

string path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

Это поместит файлы в локальный каталог пользователя, то есть данные будут доступны только для текущего пользователя. Совместное использование одного и того же файла журнала и учетных записей пользователей разными пользователями приложения, таким образом, будет невозможно, но пока это нормально.

Возможно, вам также понадобится убедиться, что папка существует: C:\Users\<user>\AppData\Local\<vendor>\<product>, поскольку она не всегда может быть создан во время установки вашего приложения. Зависит от того, есть ли у пользователя c настройки или нет.

0 голосов
/ 29 января 2020

Спасибо за ответ, но я не уточнил c достаточно.

Я застрял. Net Framework 4 Client Profile и в идеале предпочел бы, чтобы код был совместим как с рабочим столом выпустить, используя проект Install Shield и UWP Windows Store.

В предлагаемом решении используется Windows.Storage, который недоступен в текущем контексте.

Если общий код не поддерживается, возможно, существует обходной путь с использованием. Net 4 для Windows Магазин релиз, который может быть применен.

0 голосов
/ 29 января 2020

папка CommonApplicationData только для чтения после использования MSIX Packaging Tool

Если вы преобразовали свое приложение в приложение для хранения, мы можем рассматривать его как приложение UWP. В общем, мы храним пользователя информация с LocalSettings классом, который может хранить данные при обновлении приложения.

var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;

// Create a simple setting.
localSettings.Values["exampleSetting"] = "Hello Windows";

// Read data from a simple setting.
Object value = localSettings.Values["exampleSetting"];

if (value == null)
{
    // No data.
}
else
{
    // Access data in value.
}

// Delete a simple setting.
localSettings.Values.Remove("exampleSetting");

Для получения более подробной информации, пожалуйста, обратитесь к Сохранение и получение настроек и других приложений данные

...