从java中的文件夹ID和父ID创建文件夹

时间:2011-09-23 16:30:22

标签: java database jvm directory

我需要创建一个类来获取存储在数据库中的文件夹列表,并在本地计算机上以正确的层次结构创建它们。

文件夹按如下方式安排在数据库中:

id name parent_id

1 documents 0
2 movies 0
3 videos 0
4 my files 1
5 desktop 0
6 other 4

所以文档,电影,视频和桌面都在根本。 '我的文件'进入id为1(文件)的文件夹,'other'进入id为4的文件夹(我的文件)

我一直试图通过使用whyle循环但不知道如何让它们进入正确的文件夹。

try {
            con = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        while( i < 50 )
        {   
            try {            

            Statement st = con.createStatement();
            ResultSet result = st.executeQuery("SELECT name, id, parent_id FROM categories WHERE parent_id = '"+PID+"' AND repository_id = '"+RepoID+"'");



            while (result.next ())
            {
                String FolderName = result.getString ("name");
                String FolderId = result.getString ("id");
                String FolderId = result.getString ("parent_id");
make the folder name here
                System.out.println( FolderName+" "+FolderId );
            }

            System.out.println( " ");
                    i++ ;
            PID++;
            } catch (SQLException ex) {
                 System.out.println(ex.getMessage());
             }
            }

3 个答案:

答案 0 :(得分:2)

创建一个Folder对象来存储数据,然后在从数据库中读取时构建这些对象。构建完所有Folder对象后,执行最后一个循环以将每个Folder绑定到其父类。也许是这样的:

class Folder {
    private String name;
    private int id;
    private int parentId;
    private List<Folder> children = new ArrayList<Folder>();

    public Folder(String name, int id, int parentId) {
        this.name = name;
        this.id = id;
        this.parentId = parentId;
    }

    public void addChildFolder(Folder folder) {
        this.children.add(folder);
    }

    public List<Folder> getChildren() {
        return Collections.unmodifiableList(children);
    }

    public int getParentFolderId() {
        parentId;
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }
}

现在,当您从数据库中读取数据时,您将创建这些文件夹对象(没有子项)并将其添加到地图中:

Map<Integer, Folder> data = new HashMap<Integer, Folder>();

... loop through your result set getting folder data...
Folder newFolder = new Folder(nameString, id, parentId);
data.put(newFolder.getId(), newFolder);

使用Integer.valueOf(String)将String转换为int。

创建完所有文件夹后,您可以进行最后一个循环以将父文件夹连接到子文件夹,如下所示:

for(Folder folder : data.values()) {
    int parentId = folder.getParentFolderId();
    Folder parentFolder = data.get(parentId);
    if(parentFolder != null)
        parentFolder.addChildFolder(folder);
}

最后,只需获取ID为0的文件夹并开始在磁盘上构建文件,使用folder.getChildren()作为向下移动树的便捷方式。查看File对象上的javadoc,您将特别想使用mkdirs()方法。

希望有所帮助。

答案 1 :(得分:1)

一旦从数据库中获取了所有值,我建议创建一个Map<Integer,Folder>,将每个文件夹ID映射到其文件夹信息(其中Folder包含id,name和parent id)。然后,你可以循环遍历这个地图,并为每个文件夹建立完整的路径,通过递归父ID直到你到达根和(例如“foo / bar / baz”),然后调用File.mkdirs()这条路。

答案 2 :(得分:0)

我在9月29日看到你的评论询问打印文件夹。您的代码似乎没问题,只是您只打印出父文件夹的名称。如果你想要打印它们,你需要深入了解孩子并打印它们,也许是这样的:

...
for (Folder folder : data.values()) {
    int parentId = folder.getParentFolderId();
    Folder parentFolder = data.get(parentId);
    if (parentFolder != null)
        parentFolder.addChildFolder(folder);
}

printFolderRecursively(data.get(1));

然后编写一个方法,打印文件夹名称及其子项:

public void printFolderRecursively(Folder folder) {
    System.out.print("/" + rootFolderName);
    for(Folder child : folder.getChildren())
        printFolderRecursively(child);
}
希望有所帮助。