2

私は頻繁にデータを外付けドライブにバックアップしており、持っているファイルとまだ転送していないファイルを選別する必要があります。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);

2 つの JTree を取得したら、ノードを比較して外部に存在しないファイルを確認するにはどうすればよいでしょうか。ファイルの配列を比較する方が簡単でしょうか?

編集

効率的とは、ファイル ツリーが何千ものファイルで構成されている場合に、コンピューターが停止する可能性が最も低いことを意味します。

4

1 に答える 1

4

答えは次のとおりだと思います。なぜJTreeを比較するのですか? JTree はデータを表示するための GUI 要素であり、データを保存/比較/操作するためのデータ構造ではありません。

したがって、データを比較するためのデータ構造を考え出し、JTree を使用して比較結果を表示する必要があります。CPU リソースが節約したいものであると仮定すると、TreeMapを使用したいと思います。

基本的TreeMapに、ソース ファイル システムで をビルドTreeMapし、目的のファイル システムで見つけた (そして一致した) アイテムを から削除します。比較が完了したら、まだ同期が必要なファイルをJTree.

何よりも、 TreeMap はcontainsKey、 、getputおよびremoveメソッドの log(n) を保証するため、ソースにすべてのファイルを挿入するには nLog(n) のコストがかかり、すべてのファイルを削除 (基本的には比較) するには nLog(n) のコストがかかります。宛先のキー。

編集

ああ、WinMergeは、これまでファイル システムの比較に使用した中で最高のツールの 1 つです。もちろん、バックアップドライブの同期に使用したことはありません...

于 2012-12-19T19:37:40.667 に答える