ant - Need to get only file name without extension and entire path

Thiru picture Thiru · May 21, 2013 · Viewed 7.7k times · Source

I have couple of .xml files in a folder.I want to loop on each .xml file.It is getting fine. I want to take only .xml file name without entire path. How can i achieve that.?

I am using the below piece of code to get the file name.

<target name="createApplicationDAA">
  <for param="program">
    <path>
      <fileset dir="${soaProjectName}/Composites" includes="**/*.xml"/>
    </path>
    <sequential>
    <propertyregex override="yes" property="file"  input="@{program}" regexp=".*/([^\.]*)\.xml" replace="\1"/>
        <echo>@{program}</echo>
    </sequential>
  </for>
</target>

the folder name is C:/abc/bcd/cde first.xml,second.xml,third.xml,fourth.xml is the .xml files in cde folder. when i execute the above code it is getting entire path like C:/abc/bcd/cde/first.xml ..etc I want to get only first for first.xml and second for second.xml. please help me out to achieve only file name.

Answer

Rebse picture Rebse · May 21, 2013

EDIT after further investigation (see comments)

No need for regex when using basename task. Properties once set are immutable in vanilla ant, so when using basename task within for loop, the property FileName holds the value of the first file.
Therefore antcontrib var task with unset="true" has to be used :

 <for param="program">
  <path>
   <fileset dir="C:\whatever" includes="**/*.xml"/>
  </path>
  <sequential>
   <var name="FileName" unset="true"/>
   <basename property="FileName" file="@{program}" suffix=".xml"/>
   <echo>${FileName}</echo>
  </sequential>
 </for>
  1. the regex doesn't work for me on my windowsbox
  2. you're echoing the original filename when using <echo>@{program}</echo>
    use <echo>${file}</echo> instead

means something like :

<for param="program">
 <path>
  <fileset dir="C:\whatever" includes="**/*.xml"/>
 </path>
 <sequential>
 <propertyregex override="yes" property="file" input="@{program}" regexp=".:\\.+\\(\w+).+" replace="\1"/>
 <echo>${file}</echo>
 </sequential>
</for>