【问题标题】:How to list only non hidden and non system file in jtree如何在jtree中仅列出非隐藏和非系统文件
【发布时间】:2013-03-16 19:07:14
【问题描述】:
File f=new File("C:/");
File fList[] = f.listFiles();

当我使用它时,它会列出所有系统文件以及隐藏文件。

当我使用它在 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 并且在 jTree 中只显示 非隐藏和非系统文件

【问题讨论】:

  • 有没有什么方法提供文件类只列出非系统和非隐藏文件?

标签: java swing file-io jtree filefilter


【解决方案1】:

对隐藏文件执行此操作:

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.

【讨论】:

    【解决方案2】:

    如果在 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());
    

    【讨论】:

      【解决方案3】:

      如果您尝试列出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 创建窗口文件资源管理器的代码。

      【讨论】:

        猜你喜欢
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 2018-04-10
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 2013-06-19
        相关资源
        最近更新 更多