这些方法只是简单地设置文件的文件系统访问权限。为了理解它们,你需要了解操作系统/文件系统的访问控制规则。
例如在Linux上file.setWriteable(false)相当于运行chmod u-w file来清除“所有者写入”访问位:
注意:
chmod 只能在您是文件所有者或以root 运行时更改文件的任何 权限。
所有者写权限意味着所有者(或root)可以执行文件,也可以不执行。如果您都不是,那么该权限不会影响您。
因此,setWriteable 可能无法“工作”至少有两个可能的原因。
解决方案:
java.nio.file.Files 类中有一个更新/更好的用于在 Java 中设置文件权限的 API:
public static Path setPosixFilePermissions(
Path path,
Set<PosixFilePermission> perms)
throws IOException
这允许您在一次调用中设置/清除所有可用的 POSIX 文件权限,如果由于任何原因不能,它会抛出异常。
许多文件系统还支持更复杂的 ACL 机制 ....
但是
这些都不等同于 File Locker 应用程序提供的功能。为什么?因为任何通过文件权限或 ACL 阻止文件访问的尝试都可以被具有 root 访问权限的人轻易地逆转。前提是您知道它在技术层面上做什么。
Windows“文件夹锁定”应用显然可以加密文件或隐藏文件。通过设置“dos:hidden”属性,可以在 Java 7 及更高版本中将文件本地标记为隐藏;见https://stackoverflow.com/a/42816082/139985。它可能还使用权限和 ACL 来限制访问,这也可以在 Java 上执行。它也可能在做其他事情。文档说(无济于事!):
一旦文件被锁定,它就会受到各种可能的保护,并且只能通过文件夹锁定安全应用程序访问。
这听起来像是营销而不是事实,而且几乎可以肯定是不真实的。然而,要弄清楚应用程序实际在做什么,我需要获得一台 Windows 机器,下载并安装软件,然后通过尝试对其进行逆向工程来违反许可。
但请注意,上述“隐藏”方法是特定于 Windows 的。在 Linux / Mac OS 上,您可以通过将文件名的第一个字符设为点(“.”)字符来“隐藏”某些命令中的文件。