📄 copy.java
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */package org.apache.tools.ant.taskdefs;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Enumeration;import java.util.HashMap;import java.util.HashSet;import java.util.Hashtable;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Vector;import org.apache.tools.ant.Task;import org.apache.tools.ant.Project;import org.apache.tools.ant.BuildException;import org.apache.tools.ant.DirectoryScanner;import org.apache.tools.ant.types.Mapper;import org.apache.tools.ant.types.FileSet;import org.apache.tools.ant.types.FilterSet;import org.apache.tools.ant.types.FilterChain;import org.apache.tools.ant.types.FilterSetCollection;import org.apache.tools.ant.types.Resource;import org.apache.tools.ant.types.ResourceCollection;import org.apache.tools.ant.types.ResourceFactory;import org.apache.tools.ant.types.resources.FileResource;import org.apache.tools.ant.util.FileUtils;import org.apache.tools.ant.util.FileNameMapper;import org.apache.tools.ant.util.IdentityMapper;import org.apache.tools.ant.util.ResourceUtils;import org.apache.tools.ant.util.SourceFileScanner;import org.apache.tools.ant.util.FlatFileNameMapper;/** * Copies a file or directory to a new file * or directory. Files are only copied if the source file is newer * than the destination file, or when the destination file does not * exist. It is possible to explicitly overwrite existing files.</p> * * <p>This implementation is based on Arnout Kuiper's initial design * document, the following mailing list discussions, and the * copyfile/copydir tasks.</p> * * * @since Ant 1.2 * * @ant.task category="filesystem" */public class Copy extends Task { static final File NULL_FILE_PLACEHOLDER = new File("/NULL_FILE"); static final String LINE_SEPARATOR = System.getProperty("line.separator"); // CheckStyle:VisibilityModifier OFF - bc protected File file = null; // the source file protected File destFile = null; // the destination file protected File destDir = null; // the destination directory protected Vector rcs = new Vector(); private boolean enableMultipleMappings = false; protected boolean filtering = false; protected boolean preserveLastModified = false; protected boolean forceOverwrite = false; protected boolean flatten = false; protected int verbosity = Project.MSG_VERBOSE; protected boolean includeEmpty = true; protected boolean failonerror = true; protected Hashtable fileCopyMap = new Hashtable(); protected Hashtable dirCopyMap = new Hashtable(); protected Hashtable completeDirMap = new Hashtable(); protected Mapper mapperElement = null; protected FileUtils fileUtils; //CheckStyle:VisibilityModifier ON private Vector filterChains = new Vector(); private Vector filterSets = new Vector(); private String inputEncoding = null; private String outputEncoding = null; private long granularity = 0; /** * Copy task constructor. */ public Copy() { fileUtils = FileUtils.getFileUtils(); granularity = fileUtils.getFileTimestampGranularity(); } /** * Get the FileUtils for this task. * @return the fileutils object. */ protected FileUtils getFileUtils() { return fileUtils; } /** * Set a single source file to copy. * @param file the file to copy. */ public void setFile(File file) { this.file = file; } /** * Set the destination file. * @param destFile the file to copy to. */ public void setTofile(File destFile) { this.destFile = destFile; } /** * Set the destination directory. * @param destDir the destination directory. */ public void setTodir(File destDir) { this.destDir = destDir; } /** * Add a FilterChain. * @return a filter chain object. */ public FilterChain createFilterChain() { FilterChain filterChain = new FilterChain(); filterChains.addElement(filterChain); return filterChain; } /** * Add a filterset. * @return a filter set object. */ public FilterSet createFilterSet() { FilterSet filterSet = new FilterSet(); filterSets.addElement(filterSet); return filterSet; } /** * Give the copied files the same last modified time as the original files. * @param preserve a boolean string. * @deprecated since 1.5.x. * setPreserveLastModified(String) has been deprecated and * replaced with setPreserveLastModified(boolean) to * consistently let the Introspection mechanism work. */ public void setPreserveLastModified(String preserve) { setPreserveLastModified(Project.toBoolean(preserve)); } /** * Give the copied files the same last modified time as the original files. * @param preserve if true preserve the modified time; default is false. */ public void setPreserveLastModified(boolean preserve) { preserveLastModified = preserve; } /** * Get whether to give the copied files the same last modified time as * the original files. * @return the whether destination files will inherit the modification * times of the corresponding source files. * @since 1.32, Ant 1.5 */ public boolean getPreserveLastModified() { return preserveLastModified; } /** * Get the filtersets being applied to this operation. * * @return a vector of FilterSet objects. */ protected Vector getFilterSets() { return filterSets; } /** * Get the filterchains being applied to this operation. * * @return a vector of FilterChain objects. */ protected Vector getFilterChains() { return filterChains; } /** * Set filtering mode. * @param filtering if true enable filtering; default is false. */ public void setFiltering(boolean filtering) { this.filtering = filtering; } /** * Set overwrite mode regarding existing destination file(s). * @param overwrite if true force overwriting of destination file(s) * even if the destination file(s) are younger than * the corresponding source file. Default is false. */ public void setOverwrite(boolean overwrite) { this.forceOverwrite = overwrite; } /** * Set whether files copied from directory trees will be "flattened" * into a single directory. If there are multiple files with * the same name in the source directory tree, only the first * file will be copied into the "flattened" directory, unless * the forceoverwrite attribute is true. * @param flatten if true flatten the destination directory. Default * is false. */ public void setFlatten(boolean flatten) { this.flatten = flatten; } /** * Set verbose mode. Used to force listing of all names of copied files. * @param verbose whether to output the names of copied files. * Default is false. */ public void setVerbose(boolean verbose) { this.verbosity = verbose ? Project.MSG_INFO : Project.MSG_VERBOSE; } /** * Set whether to copy empty directories. * @param includeEmpty if true copy empty directories. Default is true. */ public void setIncludeEmptyDirs(boolean includeEmpty) { this.includeEmpty = includeEmpty; } /** * Set method of handling mappers that return multiple * mappings for a given source path. * @param enableMultipleMappings If true the task will * copy to all the mappings for a given source path, if * false, only the first file or directory is * processed. * By default, this setting is false to provide backward * compatibility with earlier releases. * @since Ant 1.6 */ public void setEnableMultipleMappings(boolean enableMultipleMappings) { this.enableMultipleMappings = enableMultipleMappings; } /** * Get whether multiple mapping is enabled. * @return true if multiple mapping is enabled; false otherwise. */ public boolean isEnableMultipleMapping() { return enableMultipleMappings; } /** * Set whether to fail when errors are encountered. If false, note errors * to the output but keep going. Default is true. * @param failonerror true or false. */ public void setFailOnError(boolean failonerror) { this.failonerror = failonerror; } /** * Add a set of files to copy. * @param set a set of files to copy. */ public void addFileset(FileSet set) { add(set); } /** * Add a collection of files to copy. * @param res a resource collection to copy. * @since Ant 1.7 */ public void add(ResourceCollection res) { rcs.add(res); } /** * Define the mapper to map source to destination files. * @return a mapper to be configured. * @exception BuildException if more than one mapper is defined. */ public Mapper createMapper() throws BuildException { if (mapperElement != null) { throw new BuildException("Cannot define more than one mapper", getLocation()); } mapperElement = new Mapper(getProject()); return mapperElement; } /** * Add a nested filenamemapper. * @param fileNameMapper the mapper to add. * @since Ant 1.6.3 */ public void add(FileNameMapper fileNameMapper) { createMapper().add(fileNameMapper); } /** * Set the character encoding. * @param encoding the character encoding. * @since 1.32, Ant 1.5 */ public void setEncoding(String encoding) { this.inputEncoding = encoding; if (outputEncoding == null) { outputEncoding = encoding; } } /** * Get the character encoding to be used. * @return the character encoding, <code>null</code> if not set. *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -