如何仅复制给定文件而不是目录中的所有文件

时间:2015-02-23 16:58:10

标签: java file

我正在尝试创建一个自定义文件复制器,源文件夹,目标文件夹和包含一些文件名的数组列表。然后复印机以相同的结构复制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);
            }
        }
    }

所以我希望它停止制作无用的空白文件夹,只有当它们从数组中保存目标文件时才能制作它们。 有什么想法吗?

2 个答案:

答案 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);
    }
}
[...]