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

CommonApplicationData folder read-only after using MSIX Packaging Tool

我编写了一个 .Net Windows Forms 应用程序,它使用通用应用程序数据文件夹来存储日志文件和用户帐户。该应用程序使用安装屏蔽项目分发,并在所有不同的 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 包与我的旧桌面版应用程序安装在同一台电脑上。

我遇到的问题是应用程序无法写入位于 CommonApplicationData 文件夹中的文件。应用程序可以读取和加载数据,但不能更新和写入对文件的更改。因此,文件的路径是正确的,但似乎缺少某些写入权限。我在包上尝试了不同的功能,甚至都勾选了,但没有任何效果。

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

该应用程序非常大,包含许多在 Windows Store 应用上下文中运行良好的功能。唯一缺少的是上面提到的文件写入问题。

如有任何建议,我们将不胜感激。

CommonApplicationData folder read-only after using MSIX Packaging Tool

如果您将您的应用转换为商店应用,我们可以将其视为 UWP 应用,一般情况下,我们将用户信息存储在 LocalSettings class 中,可以在应用期间保留数据正在更新。

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

详情请参考Store and retrieve settings and other app data

在不同的网站上继续搜索后,我发现了一个可行的解决方案来解决我的问题。

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> 因为它可能并不总是在您的应用程序安装期间创建。这取决于它是否有用户特定的设置。