3
File f=new File("C:/");
File fList[] = f.listFiles();

これを使用すると、すべてのシステムファイルと隠しファイルが一覧表示されます。

これを使用してjTreeに次のように表示すると、nullポインタ例外が発生します。

 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に非表示およびシステム以外のファイルのみが表示されるようにするにはどうすればよいですか?

4

3 に答える 3

17

隠しファイルに対してこれを行います:

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はJava7で導入されました。

于 2013-03-26T20:08:52.887 に答える
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());
于 2013-03-26T20:10:05.887 に答える
0

すべてのファイルを一覧表示しようとしている場合C:/は、非表示でもシステムファイルでもない他のファイルもありますが、特別な特権/権限が必要なため、それでも開かないことに注意してください。それで:

String[] files = file.list();

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

list()したがって、配列がnullであるかどうかを比較し、関数の配列がnullであるファイルをスキップするように再帰を設計します。

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を使用してウィンドウファイルエクスプローラーを作成するために使用したコードです。

于 2015-11-15T17:43:39.003 に答える