|
- <!--
- 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.
- -->
- <html>
-
- <head>
- <meta http-equiv="Content-Language" content="en-us">
- <link rel="stylesheet" type="text/css" href="../stylesheets/style.css">
- <title>Copy Task</title>
- </head>
-
- <body>
-
- <h2><a name="copy">Copy</a></h2>
- <h3>Description</h3>
- <p>Copies a file or resource collection to a new file or directory. By default, files are
- only copied if the source file is newer than the destination file,
- or when the destination file does not exist - please see
- the <code>granularity</code> attribute for Ant's idea
- of <em>newer</em>.
- However, you can explicitly
- overwrite files with the <code>overwrite</code> attribute.</p>
-
- <p><a href="../Types/resources.html#collection">Resource
- Collection</a>s are used to select a group of files to copy. To use a
- resource collection, the <code>todir</code> attribute must be set.
- <strong>Note</strong> that some resources (for example
- the <a href="../Types/resources.html#file">file</a> resource)
- return absolute paths as names and the result of using them without
- using a nested mapper (or the flatten attribute) may not be what you
- expect.</p>
-
- <p>
- <strong>Note: </strong>If you employ filters in your copy operation,
- you should limit the copy to text files. Binary files will be corrupted
- by the copy operation.
- This applies whether the filters are implicitly defined by the
- <a href="filter.html">filter</a> task or explicitly provided to the copy
- operation as <a href="../Types/filterset.html">filtersets</a>.
- <em>See <a href="#encoding">encoding note</a></em>.
- </p>
- <h3>Parameters</h3>
- <table border="1" cellpadding="2" cellspacing="0">
- <tr>
- <td valign="top"><b>Attribute</b></td>
- <td valign="top"><b>Description</b></td>
- <td align="center" valign="top"><b>Required</b></td>
- </tr>
- <tr>
- <td valign="top">file</td>
- <td valign="top">The file to copy.</td>
- <td valign="top" align="center">Yes, unless a nested
- resource collection element is used.</td>
- </tr>
- <tr>
- <td valign="top">preservelastmodified</td>
- <td valign="top">Give the copied files the same last modified
- time as the original source files.</td>
- <td valign="top" align="center">No; defaults to false.</td>
- </tr>
- <tr>
- <td valign="top">tofile</td>
- <td valign="top">The file to copy to.</td>
- <td valign="top" align="center" rowspan="2">With the <code>file</code>
- attribute, either <code>tofile</code> or <code>todir</code> can be used.<br/>
-
- With nested resource collection elements, if the number of
- included resources
- is greater than 1, or if only the <code>dir</code> attribute is
- specified in the <code><fileset></code>, or if the
- <code>file</code> attribute is also specified, then only
- <code>todir</code> is allowed.<br/>
- <em>Prior to Apache Ant 1.8.2</em> the <code>tofile</code> attribute
- only supported filesystem resources top copy from.</td>
- </tr>
- <tr>
- <td valign="top">todir</td>
- <td valign="top">The directory to copy to.</td>
- </tr>
- <tr>
- <td valign="top">overwrite</td>
- <td valign="top">Overwrite existing files even if the destination
- files are newer.</td>
- <td valign="top" align="center">No; defaults to false.</td>
- </tr>
- <tr>
- <td valign="top">force</td>
- <td valign="top">Overwrite read-only destination
- files. <em>since Ant 1.8.2</em></td>
- <td valign="top" align="center">No; defaults to false.</td>
- </tr>
- <tr>
- <td valign="top">filtering</td>
- <td valign="top">Indicates whether token filtering using the <a href="../using.html#filters">global
- build-file filters</a> should take place during the copy.
- <em>Note</em>: Nested <code><filterset></code> elements will
- always be used, even if this attribute is not specified, or its value is
- <code>false</code> (<code>no</code>, or <code>off</code>).</td>
- <td valign="top" align="center">No; defaults to false.</td>
- </tr>
- <tr>
- <td valign="top">flatten</td>
- <td valign="top">Ignore the directory structure of the source files,
- and copy all files into the directory specified by the <code>todir</code>
- attribute. Note that you can achieve the same effect by using a
- <a href="../Types/mapper.html#flatten-mapper">flatten mapper</a>.</td>
- <td valign="top" align="center">No; defaults to false.</td>
- </tr>
- <tr>
- <td valign="top">includeEmptyDirs</td>
- <td valign="top">Copy any empty directories included in the FileSet(s).
- </td>
- <td valign="top" align="center">No; defaults to true.</td>
- </tr>
- <tr>
- <td valign="top">failonerror</td>
- <td valign="top">If false, log a warning message, but do not stop the
- build, when the file to copy does not exist or one of the nested
- filesets points to a directory that doesn't exist or an error occurs
- while copying.
- </td>
- <td valign="top" align="center">No; defaults to true.</td>
- </tr>
- <tr>
- <td valign="top">quiet</td>
- <td valign="top">If true and failonerror is false, then do not log a
- warning message when the file to copy does not exist or one of the nested
- filesets points to a directory that doesn't exist or an error occurs
- while copying. <em>since Ant 1.8.3</em>.
- </td>
- <td valign="top" align="center">No; defaults to false.</td>
- </tr>
- <tr>
- <td valign="top">verbose</td>
- <td valign="top">Log the files that are being copied.</td>
- <td valign="top" align="center">No; defaults to false.</td>
- </tr>
- <tr>
- <td valign="top">encoding</td>
- <td valign="top">The encoding to assume when filter-copying the
- files. <em>since Ant 1.5</em>.</td>
- <td align="center">No - defaults to default JVM encoding</td>
- </tr>
- <tr>
- <td valign="top">outputencoding</td>
- <td valign="top">The encoding to use when writing the files.
- <em>since Ant 1.6</em>.</td>
- <td align="center">No - defaults to the value of the encoding
- attribute if given or the default JVM encoding otherwise.</td>
- </tr>
- <tr>
- <td valign="top">enablemultiplemappings</td>
- <td valign="top">
- If true the task will process to all the mappings for a
- given source path. If false the task will only process
- the first file or directory. This attribute is only relevant
- if there is a mapper subelement.
- <em>since Ant 1.6</em>.</td>
- <td align="center">No - defaults to false.</td>
- </tr>
- <tr>
- <td valign="top">granularity</td>
- <td valign="top">The number of milliseconds leeway to give before
- deciding a file is out of date. This is needed because not every
- file system supports tracking the last modified time to the
- millisecond level. Default is 1 second, or 2 seconds on DOS
- systems. This can also be useful if source and target files live
- on separate machines with clocks being out of sync. <em>since Ant
- 1.6.2</em>.</td>
- <td align="center">No</td>
- </tr>
- </table>
- <h3>Parameters specified as nested elements</h3>
-
- <h4>fileset or any other resource collection</h4>
- <p><a href="../Types/resources.html#collection">Resource
- Collection</a>s are used to select groups of files to copy. To use a
- resource collection, the <code>todir</code> attribute must be set.</p>
- <p>Prior to Ant 1.7 only <code><fileset></code> has been
- supported as a nested element.</p>
-
- <h4>mapper</h4>
- <p>You can define filename transformations by using a nested <a
- href="../Types/mapper.html">mapper</a> element. The default mapper used by
- <code><copy></code> is the <a
- href="../Types/mapper.html#identity-mapper">identity mapper</a>.</p>
- <p>
- <em>Since Ant 1.6.3</em>,
- one can use a filenamemapper type in place of the mapper element.
- </p>
-
- <p>Note that the source name handed to the mapper depends on the
- resource collection you use. If you use <code><fileset></code>
- or any other collection that provides a base directory, the name
- passed to the mapper will be a relative filename, relative to the base
- directory. In any other case the absolute filename of the source will
- be used.</p>
-
- <h4>filterset</h4>
- <p><a href="../Types/filterset.html">FilterSet</a>s are used to replace
- tokens in files that are copied.
- To use a FilterSet, use the nested <code><filterset></code> element.</p>
-
- <p>It is possible to use more than one filterset.</p>
-
- <h4>filterchain</h4>
- <p>The Copy task supports nested <a href="../Types/filterchain.html">
- FilterChain</a>s.</p>
-
- <p>
- If <code><filterset></code> and <code><filterchain></code> elements are used inside the
- same <code><copy></code> task, all <code><filterchain></code> elements are processed first
- followed by <code><filterset></code> elements.
- </p>
-
- <h3>Examples</h3>
- <p><b>Copy a single file</b></p>
- <pre>
- <copy file="myfile.txt" tofile="mycopy.txt"/>
- </pre>
- <p><b>Copy a single file to a directory</b></p>
- <pre>
- <copy file="myfile.txt" todir="../some/other/dir"/>
- </pre>
- <p><b>Copy a directory to another directory</b></p>
- <pre>
- <copy todir="../new/dir">
- <fileset dir="src_dir"/>
- </copy>
- </pre>
- <p><b>Copy a set of files to a directory</b></p>
- <pre>
- <copy todir="../dest/dir">
- <fileset dir="src_dir">
- <exclude name="**/*.java"/>
- </fileset>
- </copy>
-
- <copy todir="../dest/dir">
- <fileset dir="src_dir" excludes="**/*.java"/>
- </copy>
- </pre>
- <p><b>Copy a set of files to a directory, appending
- <code>.bak</code> to the file name on the fly</b></p>
- <pre>
- <copy todir="../backup/dir">
- <fileset dir="src_dir"/>
- <globmapper from="*" to="*.bak"/>
- </copy>
- </pre>
-
- <p><b>Copy a set of files to a directory, replacing @TITLE@ with Foo Bar
- in all files.</b></p>
- <pre>
- <copy todir="../backup/dir">
- <fileset dir="src_dir"/>
- <filterset>
- <filter token="TITLE" value="Foo Bar"/>
- </filterset>
- </copy>
- </pre>
-
- <p><b>Collect all items from the current CLASSPATH setting into a
- destination directory, flattening the directory structure.</b></p>
- <pre>
- <copy todir="dest" flatten="true">
- <path>
- <pathelement path="${java.class.path}"/>
- </path>
- </copy>
- </pre>
-
- <p><b>Copies some resources to a given directory.</b></p>
- <pre>
- <copy todir="dest" flatten="true">
- <resources>
- <file file="src_dir/file1.txt"/>
- <url url="http://ant.apache.org/index.html"/>
- </resources>
- </copy>
- </pre>
-
- <p>If the example above didn't use the flatten attribute,
- the <code><file></code> resource would have returned its full
- path as source and target name and would not have been copied at
- all. In general it is a good practice to use an explicit mapper
- together with resources that use an absolute path as their
- names.</p>
-
- <p><b>Copies the two newest resources into a destination directory.</b></p>
- <pre>
- <copy todir="dest" flatten="true">
- <first count="2">
- <sort>
- <date xmlns="antlib:org.apache.tools.ant.types.resources.comparators"/>
- <resources>
- <file file="src_dir/file1.txt"/>
- <file file="src_dir/file2.txt"/>
- <file file="src_dir/file3.txt"/>
- <url url="http://ant.apache.org/index.html"/>
- </resources>
- </sort>
- </first>
- </copy>
- </pre>
-
- <p>The paragraph following the previous example applies to this
- example as well.</p>
-
- <p><strong>Unix Note:</strong> File permissions are not retained when files
- are copied; they end up with the default <code>UMASK</code> permissions
- instead. This
- is caused by the lack of any means to query or set file permissions in the
- current Java runtimes. If you need a permission-preserving copy function,
- use <code><exec executable="cp" ... ></code> instead.
- </p>
-
- <p><strong>Windows Note:</strong> If you copy a file to a directory
- where that file already exists, but with different casing,
- the copied file takes on the case of the original. The workaround is to
- <a href="delete.html">delete</a>
- the file in the destination directory before you copy it.
- </p>
- <p>
- <strong><a name="encoding">Important Encoding Note:</a></strong>
- The reason that binary files when filtered get corrupted is that
- filtering involves reading in the file using a Reader class. This
- has an encoding specifying how files are encoded. There are a number
- of different types of encoding - UTF-8, UTF-16, Cp1252, ISO-8859-1,
- US-ASCII and (lots) others. On Windows the default character encoding
- is Cp1252, on Unix it is usually UTF-8. For both of these encoding
- there are illegal byte sequences (more in UTF-8 than for Cp1252).
- </p>
- <p>
- How the Reader class deals with these illegal sequences is up to the
- implementation
- of the character decoder. The current Sun Java implementation is to
- map them to legal characters. Previous Sun Java (1.3 and lower) threw
- a MalformedInputException. IBM Java 1.4 also throws this exception.
- It is the mapping of the characters that cause the corruption.
- </p>
- <p>
- On Unix, where the default is normally UTF-8, this is a <em>big</em>
- problem, as it is easy to edit a file to contain non US Ascii characters
- from ISO-8859-1, for example the Danish oe character. When this is
- copied (with filtering) by Ant, the character get converted to a
- question mark (or some such thing).
- </p>
- <p>
- There is not much that Ant can do. It cannot figure out which
- files are binary - a UTF-8 version of Korean will have lots of
- bytes with the top bit set. It is not informed about illegal
- character sequences by current Sun Java implementions.
- </p>
- <p>
- One trick for filtering containing only US-ASCII is to
- use the ISO-8859-1 encoding. This does not seem to contain
- illegal character sequences, and the lower 7 bits are US-ASCII.
- Another trick is to change the LANG environment variable from
- something like "us.utf8" to "us".
- </p>
-
-
-
-
- </body></html>
|