1

私は現在、Android用の基本的なファイルブラウザに取り組んでいます。ファイルをコピーするための作業バージョンがありますが、ディレクトリを介して動作するため、見つかったファイルがコピーされます。進行状況バーを改善するために、コピーを開始する前にすべてのファイルの合計サイズを確認できるように変更したいと考えています。

ディレクトリとそのすべての内容の合計サイズを見つける別の方法がある場合は?

これが私の現在のバージョンです。これを変更するのに問題があります。arrayList を使用してみましたが、最後にファイルをコピーしようとすると、間違った順序でコピーしようとしていると思います。

public void copyDirectory(File sourceLocation , File targetLocation) throws IOException {
        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists() && !targetLocation.mkdirs()) {
                throw new IOException("Cannot create directory: " + targetLocation.getAbsolutePath());
            }

            String[] children = sourceLocation.list();
            for (int i = 0; i < children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        new File(targetLocation, children[i]));
            }
        } else {                
            File directory = targetLocation.getParentFile();
            if (directory != null && !directory.exists() && !directory.mkdirs()) {
                throw new IOException("Cannot create directory: " + directory.getAbsolutePath());
            }

            FileInputStream in = new FileInputStream(sourceLocation);
            FileOutputStream out = new FileOutputStream(targetLocation);

            long fileLength = sourceLocation.length();

            byte[] buf = new byte[1024];
            long total = 0;
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
                total += len;
                publishProgress((int) (total * 100 / fileLength));
            }
            in.close();
            out.close();
        }
    }

解決

jtwiggの答えもうまくいくはずです。私が見つけた解決策を追加すると思っただけです。私自身の質問には答えられないので、ここに置きます。

ディレクトリ内のすべてのファイルをループして、実行中の合計を維持することは機能しているようです。ただし、最初にサイズをループし、実際にファイルをコピーするには再度ループする必要があります。copyDirectory() を呼び出す前に、コピーするファイルまたはディレクトリで getDirectorySize() を呼び出すだけです。

private void getDirectorySize(File sourceLocation) throws IOException {
        if (sourceLocation.isDirectory()) {
            String[] children = sourceLocation.list();
            for (int i = 0; i < children.length; i++) {
                getDirectorySize(new File(sourceLocation, children[i]));
            }
        } else {
            totalFileSize += sourceLocation.length();
        }
}

この関数には、グローバルな long totalFileSize が必要であり、必要なのは以下を置き換えることだけです。

publishProgress((int) (total * 100 / fileLength));

と:

publishProgress((int) (total * 100 / totalFileSize));
4

1 に答える 1

2

私の理解が正しければ、ディレクトリ内のすべてのファイルの合計サイズを見つけて、それらをコピーしたいと考えています。次のような別の関数を作成します。

public void beginCopy(File source, File destination)
{
    ArrayList<PendingFile> filesToCopy = new ArrayList<PendingFile>();
    long totalSize = copyDirectory(source, destination, filesToCopy);
    // totalsize now contains the size of all the files
    // files to copy now contains a list of source and destination files

    // now modifying your copy method we can copy all the files
    long totalThusFar = 0;
    for (PendingFile pending : filesToCopy)
    {
        FileInputStream in = new FileInputStream(pending.source);
        FileOutputStream out = new FileOutputStream(pending.destination);

        long fileLength = sourceLocation.length();

        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
            totalThusFar += len;
            publishProgress((int) (total * 100 / totalsize));
        }
        in.close();
        out.close();
    }
}

ソースと宛先の両方を保持するためだけに、PendingFile クラス/構造が必要になります。次のように、copy メソッドの ArrayList にそれらを追加します。

public long copyDirectory(File sourceLocation , File targetLocation, ArrayList list) throws IOException {
    if (sourceLocation.isDirectory()) {
        if (!targetLocation.exists() && !targetLocation.mkdirs()) {
            throw new IOException("Cannot create directory: " + targetLocation.getAbsolutePath());
        }

        String[] children = sourceLocation.list();
        long totalSize = 0;
        for (int i = 0; i < children.length; i++) {
            totalSize += copyDirectory(new File(sourceLocation, children[i]),
                    new File(targetLocation, children[i]), list);
            return totalSize;
        }
    } else {                
        File directory = targetLocation.getParentFile();
        if (directory != null && !directory.exists() && !directory.mkdirs()) {
            throw new IOException("Cannot create directory: " + directory.getAbsolutePath());
        }

        list.add(new PendingFile(sourceLocation, targetLocation));
        return sourceLocation.length;
    }
}

今書いたばかりなので、すぐにはうまくいかないかもしれませんが、これでうまくいくと思います。幸運を!

于 2012-07-18T14:58:21.563 に答える