我目前正在为 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));