2011-12-20 40 views
7

Quiero encontrar la ruta de un archivo en un directorio (similar al comando 'encontrar' de unix o el comando 'which', pero necesito que funcione independientemente de la plataforma) y guardarlo como una propiedad.Ant: Encuentre la ruta de un archivo en un directorio

Traté de usar la tarea whichresource ant, pero no funciona (creo que solo es bueno para mirar dentro de los archivos jar).

Preferiría si fuera puro y no escribir mi propia tarea o usar una extensión de terceros.

Tenga en cuenta que puede haber varias instancias de un archivo con ese nombre en la ruta - Quiero que devuelva solo la primera instancia (o al menos quiero poder elegir solo una).

¿Alguna sugerencia?

Respuesta

21

Una posibilidad es utilizar el selector first recursos. Por ejemplo, para encontrar un archivo llamado a.jar en algún lugar bajo el directorio jars:

<first id="first"> 
    <fileset dir="jars" includes="**/a.jar" /> 
</first> 
<echo message="${toString:first}" /> 

Si no hay archivos que coinciden con nada se hizo eco, de lo contrario obtendrá la ruta de acceso al primer partido.

+0

+1 Mucho más pulcro que el mío :) – sudocode

+0

Awesome! Eso funciona genial! ¿Podría explicar de qué se trata la cosita 'toString:'? – yonix

+3

Es solo una forma de "codificar" un tipo de Ant. Ver http://ant.apache.org/manual/properties.html#toString –

7

Aquí hay un ejemplo que selecciona el primer archivo coincidente. La lógica es la siguiente:

  • encontrar todas las coincidencias usando un fileset.
  • usando pathconvert, almacene el resultado en una propiedad, separando cada archivo coincidente con el separador de línea.
  • utiliza un head filter para que coincida con el primer archivo coincidente.

La funcionalidad está encapsulada en un macrodef para la reutilización.

<project default="test"> 

    <target name="test"> 
    <find dir="test" name="*" property="match.1"/> 
    <echo message="found: ${match.1}"/> 
    <find dir="test" name="*.html" property="match.2"/> 
    <echo message="found: ${match.2}"/> 
    </target> 

    <macrodef name="find"> 
    <attribute name="dir"/> 
    <attribute name="name"/> 
    <attribute name="property"/> 
    <sequential> 
     <pathconvert property="@{property}.matches" pathsep="${line.separator}"> 
     <fileset dir="@{dir}"> 
      <include name="@{name}"/> 
     </fileset> 
     </pathconvert> 
     <loadresource property="@{property}"> 
     <string value="${@{property}.matches}"/> 
     <filterchain> 
      <headfilter lines="1"/> 
     </filterchain> 
     </loadresource> 
    </sequential> 
    </macrodef> 

</project> 
+0

el macrodef es bastante bueno - +1 por eso :) – yonix

Cuestiones relacionadas