2

我经常将数据备份到外部驱动器,并且必须筛选我拥有和尚未传输的文件。我认为创建一个允许我选择两个目录,比较它们,然后单击几下按钮将文件传输过来的工具会很有用。

我确信这类项目已经存在,所以对我来说,这主要是一种学习体验。

所以要开始它,我有一个方法可以获取我所有的文件夹和文件,以便我可以填充我的树:

public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
    File [] children = new File(directory).listFiles(); 

    for (int i = 0; i < children.length; i++) { 
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());    

        if (children[i].isDirectory() && recursive) { 
            parent.add(node); 
            listAllFiles(children[i].getPath(), node, recursive);    
        } else if (!children[i].isDirectory()){ 
            parent.add(node); 
        }
    }
}

调用该方法后,我只需创建我的 JTree 并将其添加到我的视图中:

myTree = new JTree(parent);
jScrollPane1.setViewportView(myTree);

因此,一旦我有了两个 JTree,我将如何比较节点以查看外部文件中不存在哪些文件?只比较文件数组会更容易吗?

编辑

高效,我的意思是在文件树包含数千个文件的情况下,最不可能让计算机陷入困境。

4

1 回答 1

4

我认为答案是:为什么要比较 JTree 的?JTree 是用于显示数据的 GUI 元素 - 不是用于存储/比较/操作数据的数据结构。

所以你应该做的是想出一个数据结构来比较你的数据,然后使用 JTree 来显示你的比较结果。假设 CPU 资源是您想要节省的资源,我会说您想要使用TreeMap

本质上,您将在源文件系统上构建您的项目,然后在目标文件系统上找到(并匹配)它们时TreeMap从中删除项目。TreeMap完成比较后,您可以在JTree.

最重要的是,由于 TreeMap 保证 log(n) 用于containsKey、和方法get,将花费 nLog(n) 插入源中的所有文件,并花费 nLog(n) 删除(基本上是您的比较)所有目的地的钥匙。putremove

编辑

哦,WinMerge是我用于文件系统比较的最佳工具之一。当然,我从来没有用它来同步备份驱动器......

于 2012-12-19T19:37:40.667 回答