0

次のコードを使用して、アプリのフォルダー構造のバックアップを作成しています (リモート USB にバックアップしています)。

正常に動作しますが、現在の進行状況のパーセンテージなどを示す方法を見つけようとしています。現実的には、コピーがどのように機能するかを十分に理解していないため、ファイルの数をリストできません。フォルダでパーセンテージを計算しますか?または何を増やすか。

どんなヒントでも本当に感謝します。

これが私のバックアップコードです:

 public void doBackup(View view) throws IOException{

        Time today = new Time(Time.getCurrentTimezone());
        today.setToNow();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
        final String curDate = sdf.format(new Date());

        final ProgressDialog pd = new ProgressDialog(this);
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMessage("Running backup. Do not unplug drive");
        pd.setIndeterminate(true);
        pd.setCancelable(false);
        pd.show();
        Thread mThread = new Thread() {
        @Override
        public void run() {
        File source = new File(Global.SDcard); 
        File dest = new File(Global.BackupDir + curDate);
        try {
            copyDirectory(source, dest);
        } catch (IOException e) {

            e.printStackTrace();
        }
        pd.dismiss();


        }
        };
        mThread.start();

    }

    public void copyDirectory(File sourceLocation , File targetLocation)
            throws IOException {

                Log.e("Backup", "Starting backup");
                if (sourceLocation.isDirectory()) {
                    if (!targetLocation.exists() && !targetLocation.mkdirs()) {
                        throw new IOException("Cannot create dir " + 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 {

                    Log.e("Backup", "Creating backup directory");
                    File directory = targetLocation.getParentFile();
                    if (directory != null && !directory.exists() && !directory.mkdirs()) {
                        throw new IOException("Cannot create dir " + directory.getAbsolutePath());
                    }

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

                    byte[] buf = new byte[1024];
                    int len;
                    while ((len = in.read(buf)) > 0) {
                        out.write(buf, 0, len);
                    }
                    in.close();
                    out.close();
                    Log.e("Backup", "Finished");
                }
            }
4

1 に答える 1

0

File内容の合計サイズを取得するには、一番上で次の関数を呼び出すことができます...

long getFileSize(File aFile) {

    //Function passed a single file, return the file's length.
    if(!aFile.isDirectory())
        return aFile.length();

    //Function passed a directory.
    // Sum and return the size of the directory's contents, including subfolders.
    long netSize = 0;
    File[] files = aFile.listFiles();
    for (File f : files) {
        if (f.isDirectory())
            netSize += getFileSize(f);
        else
            netSize += f.length();
    }
    return netSize;
}

コピーされたファイルの合計サイズを追跡します。を使用SizeOfCopiedFiles/SizeOfDirectoryすると、大まかな進行状況の見積もりが得られます。

編集:プログレスバーを更新しています...

次のループは、更新を行うのに適した場所のようです...

while ((len = in.read(buf)) > 0) {
    out.write(buf, 0, len);
    sizeOfCopiedFiles += len;
    pd.setProgress((float)SizeOfCopiedFiles/SizeOfDirectory);
}

(注、0 から 1 までの値を取る pd.setProgress(float f) があると想定しています。)

これを行うには、copyDirectory(...) が ProgressDialog への参照を取得する必要があり、SizeOfCopiedFiles (以前の呼び出しからのファイル書き込みの合計) と SizeOfDirectory も取得する必要があります。関数は、各再帰呼び出しの後に更新された値を反映するために、sizeOfCopiedFiles の更新された値を返す必要があります。

最終的には、次のようなものになります... (注: わかりやすくするための擬似コード)

public long copyDirectory(File source, File target, long sizeOfCopiedFiles,
        long sizeOfDirectory, ProgressDialog pd) {

    if (source.isDirectory()) {
        for (int i = 0; i < children.length; i++) {
            sizeOfCopiedFiles = copyDirectory(sourceChild, destChild,
                    sizeOfCopiedFiles, sizeOfDirectory, pd);
        }
    } else {
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
            sizeOfCopiedFiles += len;
            pd.setProgress((float)sizeOfCopiedFiles / sizeOfDirectory);
        }

    }
    return sizeOfCopiedFiles;
}
于 2013-01-04T10:57:28.070 に答える