package fileBrowser;
import java.io.File;
public class Filewalker {
String str="";
public void walk( String path) {
File root = new File( path );
File[] list = root.listFiles();
int numfiles=list.length;
for (int i=0;i<list.length; i++ ) {
if ( list[i].isDirectory() ) {
System.out.print("<li><span>"+list[i].getName()+"</span>\n<ul>");
if(list[i].listFiles().length==0){
System.out.println("</ul>\n</li>");
continue;
}
walk( list[i].getAbsolutePath());
}
else {
System.out.println( "<li>"+list[i].getName()+"</li>" );
if(i==numfiles-1){
System.out.println("</ul>");
}
}
}
}
public static void main(String[] args) {
Filewalker fw=new Filewalker();
System.out.println("<ul>");
fw.walk("C:/test");
System.out.println("</ul>");
}
}ul列表中文件夹的嵌套是不合适的,如果文件夹中有许多嵌套文件夹,则当方法从最内部的文件夹返回时,li标记的关闭不会发生,我得到的输出是:
<ul>
<li><span>abc</span>
<ul><li><span>ced</span>
<ul><li>New Microsoft Publisher Document - Copy (2).pub</li>
<li>New Microsoft Word Document - Copy (2).docx</li>
<li><span>test</span>
<ul><li><span>inner</span>
<ul><li><span>inner2</span>
<ul><li>New Text Document.txt</li>
</ul>
<li>New Bitmap Image.bmp</li>
</ul>
<li>New Microsoft Publisher Document.pub</li>
<li>New WinRAR ZIP archive.zip</li>
</ul>
<li>New Microsoft Publisher Document - Copy.pub</li>
<li>New Microsoft Publisher Document.pub</li>
<li>New Microsoft Word Document - Copy.docx</li>
<li>New Microsoft Word Document.docx</li>
</ul>
<li>temp1.txt</li>
<li><span>xyz</span>
<ul><li>stud11.txt</li>
<li>temp.txt</li>
</ul>
</ul>发布于 2014-03-13 06:26:24
System.out.print("<li><span>"+list[i].getName()+"</span>\n<ul>");
if(list[i].listFiles().length==0){
System.out.println("</ul>\n</li>");
continue;
}这段代码看起来像问题所在。
打开<li>和<ul>,但只有当目录为空时才关闭。
发布于 2014-03-13 07:23:35
正如StanislavL之前在一个答复中所写的,您打开标记,但不要关闭它们。
除了您的代码之外,我不能给您更多的提示,但是会将您的清单分成两个函数。这是我的尝试(测试!)
public class ListFiles {
public static void main(String[] args) {
File root=new File("./../");
System.out.println("<ul>");
printDir(root);
System.out.println("</ul>");
}
static void printDir(File dir)
{
if(!dir.isDirectory())
return;
System.out.println("<li>" + dir.getName() + "</li>");
System.out.println("<ul>");
for(File file : dir.listFiles())
{
if(file.isFile())
printFile(file);
else
printDir(file);
}
System.out.println("</ul>");
}
static void printFile(File file)
{
if(!file.isFile())
return;
System.out.println("<li>" + file.getName() + "</li>");
}
}printDir()打印并列出任何目录。如果在实际目录中找到一个文件,则调用printFile()只打印带有文件名的一行。通常,可以将printFile()中的单个printFile()移到printDir()中,因此不需要额外的函数,但是如果要将更多的信息打印到文件中,则有更好的概述。
执行此操作将导致:
也许它能帮到你:-)
发布于 2014-03-13 07:37:04
您应该考虑使用Java 7中提供的新Files,这样可以使您的工作更加轻松。示例代码(未经测试,但应该完成此工作):
public void printDirectoryToStdout(final Path dirBase)
throws IOException
{
System.out.println("<ul>");
Files.walkFileTree(dirBase, new FileVisitor<Path>()
{
@Override
public FileVisitResult preVisitDirectory(final Path dir,
final BasicFileAttributes attrs)
throws IOException
{
System.out.printf("<li><span>%s</span>\n<ul>\n", dir.getFileName());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(final Path file,
final BasicFileAttributes attrs)
throws IOException
{
System.out.printf("<li>%s</li>\n", file.getFileName());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(final Path file,
final IOException exc)
throws IOException
{
throw exc;
}
@Override
public FileVisitResult postVisitDirectory(final Path dir,
final IOException exc)
throws IOException
{
if (exc != null)
throw exc;
System.out.print("\n</ul>\n</li>\n");
return FileVisitResult.CONTINUE;
}
});
System.out.println("</ul>");
}https://stackoverflow.com/questions/22370620
复制相似问题