2013-03-26 90 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的代碼。