2010-01-08 7 views
12

Básicamente, obtengo un camino como "C: \ test \ subfolder1 \ subfolder2 \ subfolder3 \ myfile.txt", pero es posible que las subcarpetas 1-3 no existan, lo que significa que obtendría una excepción si intenta escribir en el archivo.Ant: ¿Crear un directorio que contenga un archivo si aún no existe?

Hay una manera de crear la estructura de directorios en la que se encuentra el archivo de destino, ya sea utilizando alguna tarea que crea la estructura cuando se envía al archivo y luego elimina el archivo, o analizando la parte del directorio de la ruta y usando la tarea mkdir primero?

Respuesta

28

Ant creará el árbol lleno de directorios para que cuando se utiliza la tarea <mkdir>. Entonces solo necesita usar la tarea <dirname> para obtener el nombre del directorio del nombre del archivo.

<dirname property="directoryProperty" file="${filePathProperty}"/> 
<mkdir dir="${directoryProperty}" /> 

La primera línea extrae la parte del directorio de la ruta del archivo y lo almacena en la propiedad directoryProperty. La segunda línea crea el directorio (y cualquier directorio padre que no exista).

+0

Gracias. La tarea dirname es exactamente lo que estaba buscando. – Benny

+0

¿Esto puede funcionar si estoy repitiendo una tarea muchas veces? directoryProperty solo se puede establecer una vez, ¿verdad? – yellavon

3

Utilizando el

<mkdir dir="${dir}"/ > 

dentro de la etiqueta <target> debería funcionar, pero no estoy seguro de qué más quieres hacer junto con mkdir?

+0

El problema es que no tengo el directorio. Tengo la ruta de archivo. Necesito obtener el directorio de la ruta del archivo o hacer que se cree. – Benny

1

No estoy 100% seguro de que va a trabajar, pero que podría ser capaz de hacer algo como lo siguiente para hacer que el directorio padre que está buscando:

<mkdir dir="${file}/../"/>

Si eso no lo hace trabajar directamente hacia afuera, entonces puede ser vale la pena definir una propiedad utilizando la sintaxis de ubicación antes de la creación de un directorio con la nueva propiedad: <property name="dir" location="${file}/../" />

<mkdir dir="${dir}" />

0

En general, se espera que las tareas Ant de buen comportamiento creen las estructuras de directorios necesarias a menos que haya una buena razón para no hacerlo.

¿Estás escribiendo una tarea? De ser así, debe agregar la lógica de creación del directorio a su tarea. Si está obteniendo la tarea de un tercero, debe señalarles este hecho y hacer que arreglen su tarea. En su defecto, la solución de Dan debería funcionar.

3

Simplemente haga failonerror=false para evitar el error y detener toda la lógica.

<delete includeemptydirs="true" failonerror="false"> 
    <fileset dir="${builder-base.dir}" includes="**/*"/> 
</delete>  
3

Esta tarea funciona bien

<mkdir dir="${file}/../"/> 

A veces podríamos tener una opción alternativa, usando tarea contacto

<touch file="${file}" mkdirs="true" verbose="true"/> 

Esta tarea debe hacer el trabajo, pero tendría un efecto secundario de crear el archivo con tamaño cero

+0

@ William Leung: Bienvenido a SO. Por favor responda una nueva pregunta/preguntas sin respuesta. Este fue uno viejo, con una respuesta aceptada. Su respuesta no agrega mucho valor, en mi humilde opinión. – Jayan

+3

@Jayan No estoy de acuerdo, proporciona una perspectiva diferente y era lo que estaba buscando. Si no fuera por su respuesta, habría tenido que hacer una nueva pregunta. –

Cuestiones relacionadas