CommonApplicationData文件夹在使用MSIX打包工具后是只读的

问题描述 投票:0回答:3

我已经编写了一个.Net Windows Forms应用程序,该应用程序使用公共应用程序数据文件夹存储日志文件和用户帐户。该应用程序是使用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;
    }
}

我现在想通过Windows Store发布该应用程序,并已使用MSIX打包工具。要对软件包进行签名,我创建了一个自签名证书,并将其添加到“受信任的根证书颁发机构”。 .msix软件包与该应用程序的旧台式机版本安装在同一台PC上。

我的问题是应用程序无法写入CommonApplicationData文件夹中的文件。该应用程序可以读取和加载数据,但不能更新更改并将更改写入文件。因此,文件的路径是正确的,但是似乎缺少某些写权限。我已经尝试过在包装上使用其他功能,甚至全部打勾,但没有任何效果。

我还浏览到C:\Program Files\WindowsApps\<my app package>\文件夹并检查了应用程序的结构并找到了文件。它们在那里,但仅对应用程序可读。删除文件不会像在旧版Windows Windows Forms版本中那样添加文件时创建新文件。

该应用程序很大,并且包含许多功能,这些功能可以在Windows Store应用程序上下文中很好地运行。唯一缺少的是上面提到的文件写入问题。

任何建议都将不胜感激。

c# .net windows-store-apps desktop-bridge msix
3个回答
0
投票

使用MSIX打包工具后,CommonApplicationData文件夹为只读

如果您已将应用程序转换为存储应用程序,我们可以将其视为UWP应用程序,通常,我们将用户信息存储在LocalSettings类中,该类可以在应用程序更新期间保留数据。

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");


0
投票

谢谢您的答复,但我还不够具体。

我被.Net Framework 4客户端配置文件所困扰,理想情况下,希望该代码与使用Install Shield项目的桌面版本和UWP Windows Store兼容。

建议的解决方案使用Store and retrieve settings and other app data,在当前上下文中不可用。

如果不是通用代码,则可能存在一种解决方法,可以将.Net 4用于Windows应用商店发行版。


0
投票

在其他网站上继续搜索后,我找到了解决该问题的可行解决方案。

Microsoft MSDN博客描述了如何以适当的方式使用不同的文件夹。

Windows.Storage

建议的解决方案是更改:

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);,因为它可能并非始终在应用程序安装期间创建。这取决于它是否具有用户特定的设置。

© www.soinside.com 2019 - 2024. All rights reserved.