2014-02-19 3 views
1

Мне нужно перебирать все файлы в каталоге. Но мне нужно только имя каждого файла, а не абсолютные пути. Вот моя попытка использования муравьев-вно:Итерация по всем именам файлов в каталоге в Ant

<target name="store"> 
    <for param="file"> 
    <path> 
     <fileset dir="." includes="*.xqm"/> 
    </path> 
    <sequential> 
     <basename file="@{file}" property="name" /> 
     <echo message="@{file}, ${name}"/> 
    </sequential> 
    </for>    
</target> 

Проблема заключается в том, что ${name} выражение получает оценку только один раз. Есть ли другой подход к этой проблеме?

+0

См. Также: http://stackoverflow.com/questions/15245283/loop-through-directory-structure-in-ant/15258254#15258254 –

ответ

4

От ant manual basename: "When this task executes, it will set the specified property to the value of the last path element of the specified file"
Свойства После установки неизменны в ванильным муравья, поэтому при использовании задачи BASENAME в течение цикла, «имя» свойство имеет значение первого файла. Поэтому antcontrib вар задача с незадана = "истинный" должен быть использован:

<target name="store"> 
<for param="file"> 
    <path> 
    <fileset dir="." includes="*.xqm"/> 
    </path> 
    <sequential> 
    <var name="name" unset="true"/> 
    <basename file="@{file}" property="name" /> 
    <echo message="@{file}, ${name}"/> 
    </sequential> 
</for>    
</target> 

В качестве альтернативы использовать local task, при использовании Ant 1.8.x или более поздней версии:

<target name="store"> 
<for param="file"> 
    <path> 
    <fileset dir="." includes="*.xqm"/> 
    </path> 
    <sequential> 
    <local name="name"/> 
    <basename file="@{file}" property="name" /> 
    <echo message="@{file}, ${name}"/> 
    </sequential> 
</for>    
</target> 

Наконец, вы можете использовать вместо Ant Flaka из antcontrib:

<project xmlns:fl="antlib:it.haefelinger.flaka"> 
<fl:install-property-handler /> 

<fileset dir="." includes="*.xqm" id="foobar"/> 

    <!-- create real file objects and access their properties --> 
<fl:for var="f" in="split('${toString:foobar}', ';')"> 
    <echo> 
    #{ format('filename %s, last modified %tD, size %s bytes', f.tofile.toabs,f.tofile.mtime,f.tofile.size) } 
    </echo> 
</fl:for> 

    <!-- simple echoing the basename --> 
    <fl:for var="f" in="split('${toString:foobar}', ';')"> 
    <echo>#{f}</echo> 
    </fl:for> 

</project> 
1

Если вы прочь использовать задачу уага из-за муравей s tandard неизменности свойств, есть способ сделать это, воспользовавшись тем фактом, что ссылки на нормальные свойства («$ {}») и ссылки на итерированные свойства («@ {}») могут быть вложены друг в друга:

<target name="store"> 
    <for param="file"> 
     <path> 
      <fileset dir="." includes="*.xqm"/> 
     </path> 
     <sequential> 
      <basename file="@{file}" property="@{file}" /> 
      <echo message="@{file}, ${@{file}}"/> 
     </sequential> 
    </for>    
</target> 

Таким образом, вы создадите новое свойство, названное после каждого имени файла.

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