【问题标题】:How do I develop and use the CommonApplicationData special folder for a WPF application如何为 WPF 应用程序开发和使用 CommonApplicationData 特殊文件夹
【发布时间】:2014-07-25 12:47:09
【问题描述】:

我有一个在本地存储资源文件的 WPF 应用程序。资源文件由应用程序启动时运行的进程使用保持最新。资源文件会经常更新,并且对于每个运行应用程序的用户来说都是通用的,因此 CommonApplicationData 是存储这些资源文件的最佳位置。

关于 CommonApplicationData 特殊文件夹的使用和开发,我有 2 个问题。首先,如果我在 Visual Studio 中开发应用程序,CommonApplicationData 路径将使用什么?我不希望将资源文件存储在 CommonApplicationData 中,因为在开发应用程序时,这不是存储文件的正确位置。我想到的解决方案是让应用程序中的任何内容都引用 |DataDirectory|然后如果配置设置为Debug,则将DataDirectory设置为app的bin目录。如果配置设置为 Release,请将 DataDirectory 设置为 CommonApplicationData\Company\AppName 目录。这是处理此问题的推荐方法吗?

其次,CommonApplicationData 目录需要对所有运行应用程序的用户都是可写的。这个目录对所有用户都可写吗?查看我本地计算机上的文件夹安全性,看起来用户只有读取/执行权限(Windows 8.1)。使用 Windows 安装程序 (WIX) 安装应用程序时,是否需要对 CommonApplicationData\Company\AppName 目录设置权限?

我尝试搜索使用 CommonApplicationData 的推荐做法,但找不到我的问题的答案。

【问题讨论】:

    标签: c# wpf winforms wix


    【解决方案1】:

    您声称您搜索了答案,但当我搜索 CommonApplicationData 时,Bing 上的第二个结果(Google 上的第六个)是 Code Project 上的一篇文章,其中第一句提到 Microsoft 建议将所有用户共有的数据存储在CommonApplicationData 特殊文件夹并为您的数据创建一个 CompanyName/ProductName 子文件夹...作者继续提供一个类,该类可用于为 CompanyName 文件夹的所有用户设置读/写权限。

    当您需要存储应用程序的所有用户共有的数据时 在本地,微软推荐使用 System.Environment.SpecialFolder.CommonApplicationData。 此外,他们还建议在此处使用您的 CompanyName 和 ApplicationName 的子文件夹。
    这个问题是您创建的文件夹和文件只有读取/执行 创建者以外的其他用户的权限。这意味着他们不能 在没有 UAC 提升的情况下附加到其他用户或被其他用户替换。

    虽然我理解这样做的原因,但实际上它创造了一个 共享动态数据存储的问题。

    下面的类地址 通过为 CompanyName 上的所有用户设置读/写权限 文件夹和可选地设置读/写权限 ApplicationName 创建时的文件夹和子文件夹/文件继承这些 权限。

    【讨论】:

    • 我找到了引用该内容的文章,但在其中的权限部分获得了相互冲突的信息。此外,我没有发现在 Visual Studio 中开发和调试应用程序时应将应用程序数据存储在何处的最佳实践参考
    【解决方案2】:

    在安装过程中,您应该在 CommonApplicationData 中创建一个文件夹。通常首选的文件夹结构是这样的:

    c:\programdata\Company\Product\MyApp.config

    这包含应用程序默认设置。它是在安装期间写入的,通常不会由用户再次写入。它由 IT 或其他管理员管理。所以用户不能写这个是正确的。

    您的应用程序实际上应该使用 ApplicationData 进行写入。

    C:\Users\john\AppData\Roaming\Company\Product\MyApp.config

    因此,如果配置中的默认值为 true,并且用户将此值设置为 false。代码将写入用户的配置,但 Common 或 Default 配置不会更改。

    您的应用程序应首先从 ApplicationData 加载配置,如果 ApplicationData 不存在,则从 CommonApplicationData 加载配置。

    现在,如果您有一个文件希望所有用户都更改并且所有用户共享,并且一个用户更改它为另一个用户更改它,我只需将该文件驻留在 CommonApplicationData 中并通过设置使其可写安装过程中的权限。

    【讨论】:

    • 对于配置我理解并同意你所说的。我的应用程序使用了大约 150MB 的资源文件(零件图、PDF 等),这些资源文件是在应用程序启动时从后台进程中的 Web 服务更新的。这些数据对于运行该应用程序的每个人都是通用的,当每个人的信息都相同时,我不想为每个用户存储或下载 150MB。
    猜你喜欢
    • 2012-11-07
    • 2010-12-06
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多