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

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

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

 id name parent_id

 1份文件0
 2部电影0
 3个video0
 4我的档案1
 5桌面0
 6其他4

所以文档,电影,video和桌面都在根本。 ‘我的文件’进入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()); } } 

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

 class Folder { private String name; private int id; private int parentId; private List children = new ArrayList(); 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 getChildren() { return Collections.unmodifiableList(children); } public int getParentFolderId() { parentId; } public String getName() { return name; } public int getId() { return id; } } 

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

 Map data = new HashMap(); ... 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()方法。

希望有所帮助。

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

我在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); } 

希望有所帮助。