2013-02-27 31 views
0

服务器:192.168.0.18/share是Samba服务器,所有的可以写入路径有一些错Files.isWritable

Files.write(Paths.get(URI.create("file://192.168.0.18/share/aa/aaaa")), "asd34234asdasd".getBytes(), StandardOpenOption.CREATE,StandardOpenOption.APPEND); 


System.out.println(Files.isWritable(Paths.get(URI.create("file://192.168.0.18/share/aa/aaaa")))); 

我发现,第一线真正创建一个文件添加追加其中的文字。

但第二行返回false。

我不知道为什么。

我试试JDK7_u5 & u13。

谢谢。

+2

从API文档:返回:如果文件存在且为可写;如果文件不存在,则为false,因为Java虚拟机没有足够的权限或者无法确定访问权限,写入访问将被拒绝。基本上,“假”并不意味着你不能写。这只是意味着JVM不知道你可以。 – supersam654 2013-02-27 14:30:21

+0

在Windows上这是坏的。即使使用Java 8u5,如果您没有写权限,isWritable也会返回true。 – swpalmer 2014-07-22 19:42:59

回答

0

如果"file://192.168.0.18/share/aa/aaaa"不存在,当你检查,你应该测试的(现有的)目录"file://192.168.0.18/share/aa/"可写的标志,如:

Path target=Paths.get(URI.create("file://192.168.0.18/share/aa/aaaa"); 
if (Files.exists(target)){ // check existing file 
    System.out.println(Files.isWritable(target)); 
}else{ // check directory 
    System.out.println(Files.isWritable(target.getParent())); 
} 
0

当写入到一个共享的文件属性并不总是可用所以代码告诉你的是它无法确定文件是否可读。

对于实际上由不同操作系统托管的文件系统执行文件操作时,很多情况都是如此 - 低级文件属性并不总是暴露给客户端。

如果你没有new File(<your file>).exists()它几乎肯定会返回true,所以,以确定是否你看到的原因确实是相关的属性,你可以尝试两种:

DosFileAttributes attr =Files.readAttributes(<your file>, DosFileAttributes.class); 

PosixFileAttributes attr = Files.readAttributes(<your file>, PosixFileAttributes.class); 

并询问结果以查看您是否获得有意义的/预期的属性