【问题标题】:OSX/MacOS equivalent of Windows %PROGRAMDATA% environment variable相当于 Windows %PROGRAMDATA% 环境变量的 OSX/MacOS
【发布时间】:2020-04-11 13:35:34
【问题描述】:

我希望我的应用程序将一些数据(例如配置、缓存、许可证等)写入一个所有用户均可访问的共享位置。

在 Windows 上,我已对 %PROGRAMDATA% 执行此操作。

在 MacOS 上,我的研究建议使用 Library/Application Support 目录。

虽然用户特定的 ~/Library/Application Support 有效,但非用户特定的 /Library/Application Support 似乎不可写访问?

例子:

Files.writeString(Paths.get("/Library/Application Support/myfile.txt"), "hello world")

抛出异常:

java.nio.file.AccessDeniedException: /Library/Application Support/myfile.txt

这种数据有更好的目的地吗?

【问题讨论】:

  • 为什么您希望能够在没有管理员级别权限的情况下写入系统级别目录?
  • @dmckee 我希望如果 Windows 有这样的概念,MacOS 很可能也有,而我错过了一些东西。

标签: java macos file file-location


【解决方案1】:

没有真正的 macOS 等价物。存储此类内容的最佳位置可能是 /Users/Shared(请参阅 this thread on the Apple developer forum),但也不完全理想。

需要注意的一点是权限:/Users/Shared 设置了“粘性”位,这意味着用户不能删除(或重命名)他们不拥有的文件。您可能希望为您的应用程序文件创建一个子目录,以便您可以通过它控制对文件的访问。您还必须注意文件权限,因为默认情况下所有者(创建文件或文件夹的用户)拥有完全访问权限,而其他所有人都是只读的。您可能想要执行一些操作,例如将组设置为“员工”并授予组和所有者的写入权限。

另一个结果是:计算机上的每个人(以及几乎所有东西)都可以对其进行写访问,并且可以制造任何他们想要的混乱。访问权限仅限于您​​的应用(尽管沙盒应用通常没有访问权限)。请参阅开发线程中 Quinn “The Eskimo!”的警告。

【讨论】:

    【解决方案2】:

    您收到该错误是因为您尝试将文件写入 root 拥有的目录。您可以更改该目录的文件权限,以便执行您的程序的用户对该文件或其包含目录具有写入权限。

    【讨论】:

    • 谢谢,但该解决方案是特定于用户的,我已经开始工作了 - 我正在寻找“所有用户”的解决方案。
    • 如果您希望所有用户都这样做,您可以更改该目录的文件权限,以便执行您的程序的用户对该文件或其包含目录具有写入权限。
    【解决方案3】:

    我的部分要求是存储配置数据。

    Java 首选项 API - https://www.vogella.com/tutorials/JavaPreferences/article.html - 对我来说是实现这一目标的更明智的方式,因为 JRE 抽象了首选项在文件系统中的存储方式。

    但不适用于缓存数据(特别是 - 缓存文件实际上是永久的,而不是临时的)。

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 2014-12-08
      • 2020-06-08
      • 1970-01-01
      • 2019-10-11
      相关资源
      最近更新 更多