显示文件夹中所有文件相对于该文件夹中遇到的第一个文件的路径

时间:2014-09-16 06:46:40

标签: java collections directory filesystems

我是Java的新手,我试图练习一些例子,但我在文件处理主题中面临问题。

以下是我正在尝试的例子。

 T1--> T2--> T3--> T4--> Gan--> q.txt
                   |
                    -->  Lin-->Img-->s.png
                   |
                    --> p.txt

这是文件夹结构。 我希望以下列格式输出。

p.txt
Lin/Img/s.png
Gen/q.txt

这意味着当第一个文件进入任何目录时,之后将打印下一个文件,并获得第一个文件的路径。

上述目录结构不固定。它可能会改变。

以下是我已经做过的代码,但我没有得到正确的输出:

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;

class FileProgram {

    private ArrayList<File> listOfDirectories = new ArrayList<File>();
    private ArrayList<File> rawFiles = new ArrayList<File>();
    private ArrayList<String> parentDir = new ArrayList<String>();
    private ArrayList<String> filesToDisplay = new ArrayList<String>();
    private Iterator i, listDir;
    private boolean firstFile = false;
    private String parents = "";

    public void getDetails(File file) {
        try {
            if (file.exists()) {
                File directoies[] = file.listFiles();
                if (!rawFiles.isEmpty()) {
                    rawFiles.clear();
                }
                for (File f : directoies) {
                    rawFiles.add(f);
                }

                i = rawFiles.iterator();
                while (i.hasNext()) {
                    File isFile = (File) i.next();
                    if (isFile.isFile()) {
                        displayFiles(isFile);
                    }
                    if (isFile.isDirectory()) {
                        listOfDirectories.add(isFile);
                    }
                }
                iterateInnerDirectories();
            } else {
                System.out.println("Invalid File Path");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) {
        FileProgram ray = new FileProgram();
        ray.getDetails(new File("D:\\Temp"));
    }

    private void iterateInnerDirectories() {
        listDir = listOfDirectories.iterator();
        while (listDir.hasNext()) {
            File isFile = (File) listDir.next();
            File f = isFile;
            listOfDirectories.remove(isFile);
            getDetails(isFile);

        }
    }

    private void displayFiles(File file) {
        if (firstFile == false) {
            firstFile = true;
            String rootPath = file.getParent();
            rootPath = rootPath.replace(file.getName(), "");
            parentDir.add(rootPath);
            parents = file.getParentFile().getName();
            System.out.println(file.getName());
            filesToDisplay.add(file.getName());
        } else {
            String rootPath = file.getParent();
            rootPath = rootPath.replace(file.getName(), "");
            if (parentDir.contains(rootPath)) {
                parents = file.getParentFile().getName();
                System.out.println(file.getName());
                filesToDisplay.add(file.getName());
            } else {
                System.out.println(file);

            }
        }
    }
}

请有人帮助我获得上面提到的正确输出。

提前致谢。

1 个答案:

答案 0 :(得分:1)

除非您在Java 7之前使用Java,否则我强烈建议您使用Path

您可以使用Files.walkFileTree()递归遍历目录。

遇到文件(!Files.isDirectory())后,您可以使用Path.getParent()获取其父级。您可以使用Path.relativize() relative 路径打印到所有其他文件的父级。

简短实施

在此实施中,我甚至不使用Files.isDirectory(),因为visitFile()仅针对文件调用:

public static void printFiles(Path start) {
    try {
        Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
            Path parent;
            @Override
            public FileVisitResult visitFile(Path file,
                            BasicFileAttributes attrs) throws IOException {
                if (parent == null)
                    parent = file.getParent();
                System.out.println(parent.relativize(file));
                return FileVisitResult.CONTINUE;
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这就是你所说的:

printFiles(Paths.get("/path/to/T1"));