2010-01-08 5 views
12

В принципе, я получаю путь как «C: \ test \ subfolder1 \ subfolder2 \ subfolder3 \ myfile.txt», но возможно, что вложенные папки 1-3 уже не существуют, что означает, что я получаю исключение, если я попробуйте записать в файл.Ant: Создать каталог, содержащий файл, если он еще не существует?

Есть ли способ создать структуру каталогов, в которой находится целевой файл, либо с помощью какой-либо задачи, которая создает структуру при ее выходе в файл, а затем удалении файла или путем разбора части каталога пути и используя сначала задачу mkdir?

ответ

28

Ant будет создавать полное дерево каталогов для вас, когда вы используете <mkdir> задачу. Поэтому вам просто нужно использовать задачу <dirname>, чтобы получить имя каталога из имени файла.

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

Первая строка извлекает часть каталогов на пути к файлу и сохраняет ее в directoryProperty собственности. Вторая строка создает каталог (и любые родительские каталоги, которые не существуют).

+0

Спасибо. Задача dirname именно то, что я искал. – Benny

+0

Может ли это работать, если я повторяю задачу много раз? directoryProperty можно установить только один раз, правильно? – yellavon

3

Использование

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

внутри ваш <target> тег должен работать, но я не уверен, что еще вы хотите сделать вместе с MKDIR?

+0

Проблема в том, что у меня нет каталога. У меня есть путь к файлу. Мне нужно получить каталог из пути к файлу или создать его. – Benny

1

Я не 100% уверен, что это будет работать, но вы можете быть в состоянии сделать что-то вроде следующего, чтобы родительский каталог вы после:

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

Если это не работать сразу, то это может быть стоит определения свойств с помощью синтаксиса местоположения перед созданием каталога с новым свойством: <property name="dir" location="${file}/../" />

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

0

Выполненные задачи Ant обычно должны создавать любые необходимые структуры каталогов, если нет веских оснований.

Вы пишете задание? Если это так, вы должны добавить логику создания каталога в свою задачу. Если вы получаете задание от третьей стороны, вы должны указать на этот факт, и заставить их исправить свою задачу. В противном случае решение Дэна должно работать.

3

Просто сделайте failonerror=false, чтобы избежать ошибки, чтобы остановить всю логику.

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

Эта задача хорошо работает

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

Иногда мы могли бы иметь альтернативный выбор, используя сенсорную задачу

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

Эта задача должна сделать работу, но будет иметь побочный эффект для создания файл с нулевым размером

+0

@ William Leung: Добро пожаловать в SO. Пожалуйста, ответьте на новые вопросы/ненужные вопросы. Это был старый, с принятым ответом. Ваш ответ не добавляет большой ценности, ИМХО. – Jayan

+3

@Jayan Я не согласен, он предоставляет другую перспективу, и это то, что я искал. Если бы не его ответ, мне нужно было бы задать новый вопрос. –

Смежные вопросы