我正在尝试创建一个自定义文件复制器,源文件夹,目标文件夹和包含一些文件名的数组列表。然后复印机以相同的结构复制ArrayList中的文件。
只有当文件名与数组中的元素相同时,我才能通过复制来实现它。但它会创建所有文件夹,无论目标文件中是否存在。
public static void main(String[] args) {
// TODO code application logic here
File source = new File("D:\\Documents\\A X");
File dest = new File("D:\\Documents\\A X Sample");
ArrayList<String> myFiles = new ArrayList<String>();
myFiles.add("Tohi - Rooh.mp3");
try{
copyDirectory(source, dest, myFiles);;
}catch(IOException e){
e.printStackTrace();
System.exit(0);
}
}
public static void copyDirectory(File sourceLocation , File targetLocation, ArrayList<String> array)
throws IOException {
if (sourceLocation.isDirectory()) {
String[] children = sourceLocation.list();
for(String element : children){
if (array.contains(element)){
File fileToCopy = new File(sourceLocation, element);
//System.out.println(fileToCopy.getAbsolutePath());
targetLocation.mkdir();
}
//if (!targetLocation.exists()) {
// targetLocation.mkdir();
//}
}
for (int i=0; i<children.length; i++) {
copyDirectory(new File(sourceLocation, children[i]),
new File(targetLocation, children[i]), array);
}
} else {
if(array.contains(sourceLocation.getName())){
InputStream in = new FileInputStream(sourceLocation);
OutputStream out = new FileOutputStream(targetLocation);
// Copy the bits from instream to outstream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
//System.out.println("File copied from " + sourceLocation + " to " + targetLocation);
}
}
}
所以我希望它停止制作无用的空白文件夹,只有当它们从数组中保存目标文件时才能制作它们。 有什么想法吗?
答案 0 :(得分:1)
我有一个将文件复制到另一个位置的方法。也许有帮助 私人
void copyFile(File source,File destination) throws IOException
{
InputStream is; OutputStream os;
try
{
is=new FileInputStream(source);
os=new FileOutputStream(destination);
byte[] buffer=new byte[1024];
int length;
while((length=is.read(buffer))>0)
{ os.write(buffer,0,length); }
is.close();
os.close();
}
catch(NullPointerException e){}
}
如果您想检查文件是否存在,请尝试从中读取文件,如果该文件不存在则会抛出错误。
答案 1 :(得分:1)
您正在为copyDirectory
的每个孩子调用您的方法sourceLocation
。纠正它的方法(不是唯一或最好的)是保存要复制的文件,并且位于sourceDiretory
上的List
。例如:
[...]
if (sourceLocation.isDirectory()) {
String[] children = sourceLocation.list();
// List to save the name of the files you want to copy
List<String> foundFiles = new ArrayList<String>(array.size());
for(String element : children){
if (array.contains(element)){
// If the file you want to copy are in the sourceDiretory
// add its name to the list
foundFiles.add(element);
targetLocation.mkdirs();
}
}
for (String foundFile : foundFiles) {
copyDirectory(new File(sourceLocation, foundFile),
new File(targetLocation, foundFile), array);
}
}
[...]