2015-09-18 191 views
0

我有一个服务器客户端程序,服务器运行在Raspberry Pi(运行Linux)上,客户端是Android应用程序。我正在编写一个应用程序文件浏览器,它只是向服务器发送路径,然后服务器使用file.listFiles()(服务器用Java编写)返回文件列表。File.canRead()返回false

我运行的服务器/ Java程序为sudo,希望这将允许跨系统访问所有文件,但令我惊讶的是,该用户没有对/home目录的读取权限。

因此,这里是按顺序会发生什么:

我要求file.listFiles(new File("/"));被发送超过插座从曹丕Android应用程序。在应用程序中,在发出下一个请求之前,我检查是否可以使用file.canRead();/home目录读取文件,这会返回false。在皮

文件权限:

[email protected] ~ $ ls -l/| grep home 
drwxr-xr-x 3 root root 4096 Dec 31 1969 home 

我如何运行我的Java服务器:

[email protected] ~ $ sudo java -cp "/usr/local/lib/bluecovelib/bluecove/target/bluecove-2.1.1-SNAPSHOT.jar:/usr/local/lib/bluecovelib/bluecove-gpl-2.1.1-SNAPSHOT/target/bluecove-gpl-2.1.1-SNAPSHOT.jar:/home/pi/severinteractionutils.jar:." AppConnect 

为什么sudo用户没有从Java程序访问/home目录?

编辑:

我跑皮一个简单的程序来测试它是否是因为底层的操作系统已经改变。显然它确实有效。

public class TestFileBrowser { 
    public static void main(String[] args) { 
     System.out.println("Hello, World"); 
     File file = new File("/"); 
     File [] files = file.listFiles(); 
     for(int i=0; i<files.length; ++i) { 
      if(files[i].getAbsolutePath().equals("/home")) { 
       File homeDir = files[i]; 
       if(homeDir.canRead()) { 
        System.out.println("Can Read"); 
        if (homeDir.isDirectory()) { 
         System.out.println("Is directory"); 
        } 
       } 
      } 
     } 
    } 
} 

,这里是控制台快照:

[email protected] ~ $ sudo javac TestFileBrowser.java 
[email protected] ~ $ sudo java TestFileBrowser 
Hello, World 
Can Read 
Is directory 

回答

2

和/ home目录,这将返回false。

正确,因为无法使用典型的文件流IO读取目录。您可以拨打File.isDirectory()哪些(每个Javadoc)

测试此抽象路径名表示的文件是否为目录。

如果需要区分I/O异常和文件不是目录的情况,或者需要同时需要同一文件的多个属性的情况,则可以使用Files.readAttributes方法。

而且您可以检查使用属性进行读取的权限。

+0

那么,在这种情况下,我怎样才能得到'/ home'目录的内容。基本上,如何获得一个功能性的远程文件浏览器。另外,'file.isDirectory()'为我返回false。 –

+0

然后你不能得到的内容,因为它不是一个目录。尝试像'新的文件(System.getProperty(“user.home”))。listFiles();' –

+0

我试过了,但因为我运行程序作为sudo(这是由于程序中的其他事情需要)它返回'/ root'作为主目录,这是没有用的。另请参阅'ls -l/|的内容有问题的grep home“,其中指出它是一个目录 –