私は現在、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));