使用apache的commons.io包FileUtils.copyDirectory方法对目录文件进行拷贝,请问怎么样才能让拷贝不覆盖原有的同名文件或文件夹???
求大神教育,多谢:)apachejava 文件拷贝

解决方案 »

  1.   

    这个方法我没用过,如果单单只提供了这一个方法的话,那么只能自己写方法了。
    不过我感觉写jar包的人不会想不到这点,
    FileUtils中肯定还有多参数的copyDirectory方法
      

  2.   


    (⊙v⊙)嗯
    看了下源代码,还有其他参数可以传,但是没看明白~/**
         * Copies a whole directory to a new location preserving the file dates.
         * <p>
         * This method copies the specified directory and all its child
         * directories and files to the specified destination.
         * The destination is the new location and name of the directory.
         * <p>
         * The destination directory is created if it does not exist.
         * If the destination directory did exist, then this method merges
         * the source with the destination, with the source taking precedence.
         *
         * @param srcDir  an existing directory to copy, must not be <code>null</code>
         * @param destDir  the new directory, must not be <code>null</code>
         *
         * @throws NullPointerException if source or destination is <code>null</code>
         * @throws IOException if source or destination is invalid
         * @throws IOException if an IO error occurs during copying
         * @since Commons IO 1.1
         */
        public static void copyDirectory(File srcDir, File destDir) throws IOException {
            copyDirectory(srcDir, destDir, true);
        }    /**
         * Copies a whole directory to a new location.
         * <p>
         * This method copies the contents of the specified source directory
         * to within the specified destination directory.
         * <p>
         * The destination directory is created if it does not exist.
         * If the destination directory did exist, then this method merges
         * the source with the destination, with the source taking precedence.
         *
         * @param srcDir  an existing directory to copy, must not be <code>null</code>
         * @param destDir  the new directory, must not be <code>null</code>
         * @param preserveFileDate  true if the file date of the copy
         *  should be the same as the original
         *
         * @throws NullPointerException if source or destination is <code>null</code>
         * @throws IOException if source or destination is invalid
         * @throws IOException if an IO error occurs during copying
         * @since Commons IO 1.1
         */
        public static void copyDirectory(File srcDir, File destDir,
                boolean preserveFileDate) throws IOException {
            copyDirectory(srcDir, destDir, null, preserveFileDate);
        }    /**
         * Copies a filtered directory to a new location preserving the file dates.
         * <p>
         * This method copies the contents of the specified source directory
         * to within the specified destination directory.
         * <p>
         * The destination directory is created if it does not exist.
         * If the destination directory did exist, then this method merges
         * the source with the destination, with the source taking precedence.
         *
         * <h4>Example: Copy directories only</h4> 
         *  <pre>
         *  // only copy the directory structure
         *  FileUtils.copyDirectory(srcDir, destDir, DirectoryFileFilter.DIRECTORY);
         *  </pre>
         *
         * <h4>Example: Copy directories and txt files</h4>
         *  <pre>
         *  // Create a filter for ".txt" files
         *  IOFileFilter txtSuffixFilter = FileFilterUtils.suffixFileFilter(".txt");
         *  IOFileFilter txtFiles = FileFilterUtils.andFileFilter(FileFileFilter.FILE, txtSuffixFilter);
         *
         *  // Create a filter for either directories or ".txt" files
         *  FileFilter filter = FileFilterUtils.orFileFilter(DirectoryFileFilter.DIRECTORY, txtFiles);
         *
         *  // Copy using the filter
         *  FileUtils.copyDirectory(srcDir, destDir, filter);
         *  </pre>
         *
         * @param srcDir  an existing directory to copy, must not be <code>null</code>
         * @param destDir  the new directory, must not be <code>null</code>
         * @param filter  the filter to apply, null means copy all directories and files
         *  should be the same as the original
         *
         * @throws NullPointerException if source or destination is <code>null</code>
         * @throws IOException if source or destination is invalid
         * @throws IOException if an IO error occurs during copying
         * @since Commons IO 1.4
         */
        public static void copyDirectory(File srcDir, File destDir,
                FileFilter filter) throws IOException {
            copyDirectory(srcDir, destDir, filter, true);
        }    /**
         * Copies a filtered directory to a new location.
         * <p>
         * This method copies the contents of the specified source directory
         * to within the specified destination directory.
         * <p>
         * The destination directory is created if it does not exist.
         * If the destination directory did exist, then this method merges
         * the source with the destination, with the source taking precedence.
         *
         * <h4>Example: Copy directories only</h4> 
         *  <pre>
         *  // only copy the directory structure
         *  FileUtils.copyDirectory(srcDir, destDir, DirectoryFileFilter.DIRECTORY, false);
         *  </pre>
         *
         * <h4>Example: Copy directories and txt files</h4>
         *  <pre>
         *  // Create a filter for ".txt" files
         *  IOFileFilter txtSuffixFilter = FileFilterUtils.suffixFileFilter(".txt");
         *  IOFileFilter txtFiles = FileFilterUtils.andFileFilter(FileFileFilter.FILE, txtSuffixFilter);
         *
         *  // Create a filter for either directories or ".txt" files
         *  FileFilter filter = FileFilterUtils.orFileFilter(DirectoryFileFilter.DIRECTORY, txtFiles);
         *
         *  // Copy using the filter
         *  FileUtils.copyDirectory(srcDir, destDir, filter, false);
         *  </pre>
         * 
         * @param srcDir  an existing directory to copy, must not be <code>null</code>
         * @param destDir  the new directory, must not be <code>null</code>
         * @param filter  the filter to apply, null means copy all directories and files
         * @param preserveFileDate  true if the file date of the copy
         *  should be the same as the original
         *
         * @throws NullPointerException if source or destination is <code>null</code>
         * @throws IOException if source or destination is invalid
         * @throws IOException if an IO error occurs during copying
         * @since Commons IO 1.4
         */
        public static void copyDirectory(File srcDir, File destDir,
                FileFilter filter, boolean preserveFileDate) throws IOException {
            if (srcDir == null) {
                throw new NullPointerException("Source must not be null");
            }
            if (destDir == null) {
                throw new NullPointerException("Destination must not be null");
            }
            if (srcDir.exists() == false) {
                throw new FileNotFoundException("Source '" + srcDir + "' does not exist");
            }
            if (srcDir.isDirectory() == false) {
                throw new IOException("Source '" + srcDir + "' exists but is not a directory");
            }
            if (srcDir.getCanonicalPath().equals(destDir.getCanonicalPath())) {
                throw new IOException("Source '" + srcDir + "' and destination '" + destDir + "' are the same");
            }        // Cater for destination being directory within the source directory (see IO-141)
            List exclusionList = null;
            if (destDir.getCanonicalPath().startsWith(srcDir.getCanonicalPath())) {
                File[] srcFiles = filter == null ? srcDir.listFiles() : srcDir.listFiles(filter);
                if (srcFiles != null && srcFiles.length > 0) {
                    exclusionList = new ArrayList(srcFiles.length);
                    for (int i = 0; i < srcFiles.length; i++) {
                        File copiedFile = new File(destDir, srcFiles[i].getName());
                        exclusionList.add(copiedFile.getCanonicalPath());
                    }
                }
            }
            doCopyDirectory(srcDir, destDir, filter, preserveFileDate, exclusionList);
        }    /**
         * Internal copy directory method.
         * 
         * @param srcDir  the validated source directory, must not be <code>null</code>
         * @param destDir  the validated destination directory, must not be <code>null</code>
         * @param filter  the filter to apply, null means copy all directories and files
         * @param preserveFileDate  whether to preserve the file date
         * @param exclusionList  List of files and directories to exclude from the copy, may be null
         * @throws IOException if an error occurs
         * @since Commons IO 1.1
         */
        private static void doCopyDirectory(File srcDir, File destDir, FileFilter filter,
                boolean preserveFileDate, List exclusionList) throws IOException {
            if (destDir.exists()) {
                if (destDir.isDirectory() == false) {
                    throw new IOException("Destination '" + destDir + "' exists but is not a directory");
                }
            } else {
                if (destDir.mkdirs() == false) {
                    throw new IOException("Destination '" + destDir + "' directory cannot be created");
                }
                if (preserveFileDate) {
                    destDir.setLastModified(srcDir.lastModified());
                }
            }
            if (destDir.canWrite() == false) {
                throw new IOException("Destination '" + destDir + "' cannot be written to");
            }
            // recurse
            File[] files = filter == null ? srcDir.listFiles() : srcDir.listFiles(filter);
            if (files == null) {  // null if security restricted
                throw new IOException("Failed to list contents of " + srcDir);
            }
            for (int i = 0; i < files.length; i++) {
                File copiedFile = new File(destDir, files[i].getName());
                if (exclusionList == null || !exclusionList.contains(files[i].getCanonicalPath())) {
                    if (files[i].isDirectory()) {
                        doCopyDirectory(files[i], copiedFile, filter, preserveFileDate, exclusionList);
                    } else {
                        doCopyFile(files[i], copiedFile, preserveFileDate);
                    }
                }
            }
        }