gpt4 book ai didi

java - File.canWrite 和 Files.isWritable 在 Linux 上没有给出正确的值

转载 作者:搜寻专家 更新时间:2023-11-01 03:04:12 26 4
gpt4 key购买 nike

我有这个测试java程序

import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.Files;

public class TestFileReadOnly
{
public static void main(String[] args)
{
String filePath = args[0];
File f = new File(filePath);

System.out.println("File.canWrite() for file: " + filePath + ", is: " + f.canWrite());
System.out.println("Files.isWritable() for file: " + filePath + ", is: " + Files.isWritable(FileSystems.getDefault().getPath(f.getParent(), f.getName())));
}
}

我使用 root 登录 Linux 并创建两个文件。

echo "test file" > /root/ro.txt
echo "test file" > /root/rw.txt
chmod 444 /root/ro.txt
chmod 777 /root/rw.txt

我这样执行测试程序时,输出总是不正确

[root@xxx ~]# /jdk1.8.0_31/bin/java TestFileReadOnly /root/ro.txt
File.canWrite() for file: /root/ro.txt, is: true
Files.isWritable() for file: /root/ro.txt, is: true
[root@xxx ~]# /jdk1.8.0_31/bin/java TestFileReadOnly /root/rw.txt
File.canWrite() for file: /root/rw.txt, is: true
Files.isWritable() for file: /root/rw.txt, is: true

我基本上是在寻找 Java 代码来验证文件是否是只读的,但我无法使用上面的代码来实现它。但是,这在 Windows 上运行良好。我尝试使用 jdk1.7.0_07、jdk1.7.0_75 和 jdk1.8.0_31 进行编译和执行,但结果是一样的。非常感谢解决此问题的任何帮助。

解决方案:使用@Matteo 的建议将 PosixFileAttributes 用于类 UNIX 平台。工作代码如下:

private boolean isFileReadOnly(File file)
{
boolean isReadOnly = false;
if (System.getProperty("os.name").startsWith("Windows"))
{
// All Windows versions
isReadOnly = !file.canWrite();
}
else
{
// All Unix-like OSes.
Path path = Paths.get(file.getParent(), file.getName());
PosixFileAttributes attributes = null;
try
{
attributes = Files.getFileAttributeView(path, PosixFileAttributeView.class).readAttributes();
}
catch (java.io.IOException e)
{
// File presence is guaranteed. Ignore
e.printStackTrace();
}

if (attributes != null)
{
// A file is read-only in Linux only when it has 0444 permissions.
Set<PosixFilePermission> permissions = attributes.permissions();

if (!permissions.contains(PosixFilePermission.OWNER_WRITE)
&& !permissions.contains(PosixFilePermission.OWNER_EXECUTE)
&& !permissions.contains(PosixFilePermission.GROUP_WRITE)
&& !permissions.contains(PosixFilePermission.GROUP_EXECUTE)
&& !permissions.contains(PosixFilePermission.OTHERS_WRITE)
&& !permissions.contains(PosixFilePermission.OTHERS_EXECUTE))
{
isReadOnly = true;
}
}
}
return isReadOnly;
}

最佳答案

以普通用户身份执行您的程序,在这两种情况下您都会得到 false,因为您无法访问 /root 目录。

root 身份执行您的程序,在这两种情况下您都将得到 true,因为 root 即使没有写入权限也可以写入文件:

$ echo uuu > ro.txt 
$ echo > ro.txt
$ ls -l ro.txt
-r--r--r-- 1 root root 1 Feb 6 15:03 ro.txt
$ cat ro.txt

$ echo Test > ro.txt
$ cat ro.txt
Test

关于java - File.canWrite 和 Files.isWritable 在 Linux 上没有给出正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28366433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com