如何在jtree中仅列出非隐藏和非系统文件
Posted
技术标签:
【中文标题】如何在jtree中仅列出非隐藏和非系统文件【英文标题】:How to list only non hidden and non system file in 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 中只显示 非隐藏和非系统文件?
【问题讨论】:
有没有什么方法提供文件类只列出非系统和非隐藏文件? 【参考方案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 创建窗口文件资源管理器的代码。
【讨论】:
以上是关于如何在jtree中仅列出非隐藏和非系统文件的主要内容,如果未能解决你的问题,请参考以下文章
缓冲文件系统(fopen/fread/fwrite)和非缓冲文件系统(open/read/write)