我有一个在本地存储资源文件的 WPF 应用程序。应用程序启动时运行的进程使用资源文件来保持最新状态。资源文件经常更新,并且对于运行应用程序的每个用户来说都是通用的,因此 CommonApplicationData 是存储这些资源文件的最佳位置。
我有 2 个关于 CommonApplicationData 特殊文件夹的使用和开发的问题。首先,如果我在 Visual Studio 中开发应用程序,那么 CommonApplicationData 路径将使用什么?我不希望将资源文件存储在 CommonApplicationData 中,因为当应用程序正在开发时,这不是存储文件的正确位置。我想到的解决方案是让应用程序中的任何内容引用 |DataDirectory|然后,如果配置设置为“调试”,请将 DataDirectory 设置为应用程序的 bin 目录。如果配置设置为“Release”,请将 DataDirectory 设置为 CommonApplicationData\Company\AppName 目录。这是处理此问题的推荐方法吗?
其次,CommonApplicationData 目录需要对运行该应用程序的所有用户都是可写的。该目录对所有用户都可写吗?查看本地计算机上的文件夹安全性,看起来用户只有读取/执行权限(Windows 8.1)。使用 Windows 安装程序 (WIX) 安装应用程序时,是否需要设置 CommonApplicationData\Company\AppName 目录的权限?
我尝试搜索使用 CommonApplicationData 的推荐实践,但无法找到我的问题的答案。
安装过程中,您应该在
CommonApplicationData
中创建一个文件夹。通常,首选的文件夹结构如下所示:
C:\ProgramData\Company\Product\MyApp.config
这包含应用程序默认设置。它是在安装过程中写入的,通常用户不会再次写入。它由 IT 或其他管理员管理。因此,用户无法写入此内容是正确的。
您的应用程序实际上应该使用
ApplicationData
进行书写。
C:\Users\john\AppData\Roaming\Company\Product\MyApp.config
因此,如果配置中的默认值为 true 并且用户将此值设置为 false。该代码将写入用户的配置,但通用或默认配置不会更改。
您的应用程序应首先从
ApplicationData
加载配置,如果 ApplicationData
不存在,则从 CommonApplicationData
加载配置。
现在,如果您希望所有用户更改并共享一个文件,并且一个用户更改它并为另一个用户更改它,我将简单地将该文件驻留在
CommonApplicationData
中,并通过设置安装过程中的权限。
您声称您搜索了答案,但当我搜索
CommonApplicationData
时,Bing 上的第二个结果(Google 上的第六个)是一篇关于 Code Project 的文章,其中第一句提到 Microsoft 建议在 中存储所有用户通用的数据CommonApplicationData
特殊文件夹并为您的数据创建 CompanyName/ProductName 子文件夹...作者继续提供一个类,可用于为所有用户设置 CompanyName 文件夹的读/写权限。
当您需要存储应用程序所有用户共有的数据时 在本地,微软建议使用 System.Environment.SpecialFolder.CommonApplicationData。 此外,他们还建议在此处创建一个子文件夹,其中包含您的公司名称和 ApplicationName 中的子文件夹。
问题是您创建的文件夹和文件只能读取/执行 除创建者之外的其他用户的权限。这意味着他们不能 附加到或由其他用户替换,无需 UAC 提升。虽然我理解这样做的原因,但实际上它创造了一个 共享动态数据存储的问题。
下面的类地址 通过为 CompanyName 上的所有用户设置读/写权限来实现这一点 文件夹并可选择设置该文件夹的读/写权限 创建时的 ApplicationName 文件夹和子文件夹/文件继承这些 权限。