2013-03-26 95 views
2
File f=new File("C:/"); 
File fList[] = f.listFiles(); 

当我使用它时,它会列出所有系统文件以及隐藏文件。如何在jtree中只列出非隐藏和非系统文件

这个原因空指针异常,当我使用它的JTree显示这样

public void getList(DefaultMutableTreeNode node, File f) { 
if(f.isDirectory()) { 
    DefaultMutableTreeNode child = new DefaultMutableTreeNode(f); 
    node.add(child); 
    File fList[] = f.listFiles(); 
    for(int i = 0; i < fList.length; i++) 
     getList(child, fList[i]); 
    } 
} 

我应该怎么办,以便它不给NullPointerException异常,仅显示非隐蔽性和非系统文件 in jTree?

+0

有没有什么方法提供只列出非系统和非隐藏文件的文件类? – 2013-03-26 20:09:30

回答

11

这样做对隐藏文件:

File root = new File(yourDirectory); 
File[] files = root.listFiles(new FileFilter() { 
    @Override 
    public boolean accept(File file) { 
     return !file.isHidden(); 
    } 
}); 

这将不会返回隐藏文件。

至于系统文件,我相信这是一个Windows概念,因此可能不支持File尝试独立于系统的接口。尽管如此,你可以使用命令行命令。

或者使用@Reimeus在他的答案中的内容。

可能像

File root = new File("C:\\"); 

    File[] files = root.listFiles(new FileFilter() { 
     @Override 
     public boolean accept(File file) { 
      Path path = Paths.get(file.getAbsolutePath()); 
      DosFileAttributes dfa; 
      try { 
       dfa = Files.readAttributes(path, DosFileAttributes.class); 
      } catch (IOException e) { 
       // bad practice 
       return false; 
      } 
      return (!dfa.isHidden() && !dfa.isSystem()); 
     } 
    }); 

DosFileAttributes was introduced in Java 7.

3

如果Windows,Java 7的推出DosFileAttributes使系统和隐藏文件下运行进行过滤。这可以结合使用一个FileFilter

Path srcFile = Paths.get("myDirectory"); 
DosFileAttributes dfa = Files.readAttributes(srcFile, DosFileAttributes.class); 
System.out.println("System File? " + dfa.isSystem()); 
System.out.println("Hidden File? " + dfa.isHidden()); 
0

如果你想列出C:/的所有文件,请记住,还有其他文件也既不是隐藏的,也没有系统文件,但仍然不会因为它们需要特殊的权限/权限而打开。所以:

String[] files = file.list(); 

if (files!=null) { 
    for (String f : files) open(f); 
} 

所以才比较,如果数组为空或不和设计递归以这样一种方式,它只是跳过它的数组中list()功能是空的文件。

private void nodes(DefaultMutableTreeNode top, File f) throws IOException { 

if (f.isDirectory()) { 
    File[] listFiles = f.listFiles(); 

    if (listFiles != null) { 
     DefaultMutableTreeNode b1[] = new DefaultMutableTreeNode[listFiles.length]; 
     for (int i = 0; i < b1.length; i++) { 
      b1[i] = new DefaultMutableTreeNode(listFiles[i].toString()); 
      top.add(b1[i]); 
      File g = new File(b1[i].toString()); 
      nodes(b1[i], g); 
     } 
    } 
} 

这是我用来创建一个窗口文件浏览器使用jtree的代码。