我有一个测试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"))
{
isReadOnly = !file.canWrite();
}
else
{
Path path = Paths.get(file.getParent(), file.getName());
PosixFileAttributes attributes = null;
try
{
attributes = Files.getFileAttributeView(path, PosixFileAttributeView.class).readAttributes();
}
catch (java.io.IOException e)
{
e.printStackTrace();
}
if (attributes != null)
{
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;
}