微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用File I / O在Windows中遍历目录

我正在编写一个程序,使用文件I / O遍历用户给出的目录,然后将这些目录添加到通用链接列表中。 我写的程序在Ubuntu上完美工作,但在Windows上使用时却不起作用。 这是一个相当长的程序,但这是我认为有问题的部分:

private Node<Item> currentNode = new Node<Item>(); public void traverse(File fileObject) { File allFiles[] = fileObject.listFiles(); for(File aFile: allFiles){ System.out.println(aFile.getName()); /* debugging */ recursiveTraversal(aFile); /* Line 34 */ } } public void recursiveTraversal(File fileObject){ Node<Item> newNode = new Node<Item>(); currentNode.addChild(newNode); currentNode = newNode; if (fileObject.isDirectory()){ newNode.setData(new Item()); File allFiles[] = fileObject.listFiles(); for(File aFile : allFiles){ /* This is line 48 */ recursiveTraversal(aFile); } }else if (fileObject.isFile()){ newNode.setData(new Item()); } currentNode = newNode.getParent(); }

当我在Linux上使用它时,我可以给它类似/home/matt/Documents和它的工作原理,但是当我在使用G:\Users\Matt\Documents Windows上进行尝试时,它将出错。 我input的打印语句实际上打印出文件夹中的文件,但程序的其余部分却弄乱了一些东西:

java.lang.NullPointerException at FileTraverse.recursiveTraversal(FileTraverse.java:48) at FileTraverse.traverse(FileTraverse.java:34) at DirectoryMain$ClickAction.actionPerformed(DirectoryMain.java:103) ...

之后的很多错误都与Swing GUI有关,这个程序正在运行,但我不认为这与任何事情有关。

编辑:添加在跟踪对应的行号。

如何使用C读取文件夹中的所有文件

使用find – 删除除Linux以外的所有文件/目录

将“file”linux命令应用于Perl中的二进制缓冲区

用Java读取.Z文件(unix压缩文件

为什么在Linux上存在FileNotFoundException?

从batch file创build一个空白文件

C ++编程:导航到用户文件以保存每个用户的应用程序数据

如何使用Windows命令行search文件,然后用位置创build文本文档?

Java如何规避Windows MAX_PATH WinAPI限制

自定义预取

我的猜测是,你正在打一个目录,由于某些原因,Windows不允许你查看。 在这种情况下,listFiles()很可能返回null。

从File.listFile()的Javadoc(加入强调):

返回:一个抽象路径名数组,表示由此抽象路径名表示的目录中的文件和目录。 如果目录是空的,数组将是空的。 如果此抽象路径名不表示目录或发生I / O错误,则返回null。您将需要应对来自listFiles()空返回值,不幸的是使用java.io.File API无法找到发生了什么错误。如果您正在使用Java 7,则可以使用DirectoryStream类:private void recursiveTraversal(Path path) throws IOException { try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) { for (Path entry : stream) { //Do something with entry doSomething(entry); if (Files.isDirectory(entry)) recursiveTraversal(entry); } } }不同的是, newDirectoryStream()可以抛出一个IOException (或一个像AccessDeniedException这样的子类,它提供了关于调用失败原因的信息。如果你在第48行得到一个NullPointerException ,它必须意味着你获得的allFiles数组是null 。 根据该方法的JavaDoc ,只有在您调用它的文件不是目录或发生某些IO错误时才会发生这种情况。 这有点奇怪,因为你检查if是否是一个目录。 也许在操作系统级别有一些访问问题,关于权限。您可能需要考虑使用FileFilter或java.nio.file包中的东西。 我相信后者使遍历目录更容易。traverse()和recursiveTraversal() traverse()之间的区别对我来说有点奇怪, 你什么时候使用traverse() ? 它发挥了什么作用recursiveTraversal()还没有做? 当然, traverse()假定它正在处理一个目录,但是recursiveTraversal()已经很好的处理了目录。在recursiveTraversal()有Item的所有操作,但由于在这里什么都不做 ,所以很难发现这个工具。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐