我想在目录中找到文件的路径(类似于unix的'find'命令或'which'命令,但我需要它独立于平台工作)并将其保存为属性。
尝试使用whichresource
ant任务,但它没有做到这一点(我认为它只适合查看jar文件)。
我更喜欢如果它是纯蚂蚁,而不是写我自己的任务或使用第三方扩展。
请注意,路径中可能有多个同名文件的实例-我希望它只返回第一个实例(或者至少我希望能够只选择一个)。
有什么建议吗?
一种可能性是使用first
资源选择器。例如,要在目录jars
下查找一个名为a.jar
的文件:
<first id="first">
<fileset dir="jars" includes="**/a.jar" />
</first>
<echo message="${toString:first}" />
如果没有匹配的文件,则不回显任何内容,否则您将获得第一个匹配的路径。
下面是选择第一个匹配文件的示例。逻辑如下:
- 使用文件集查找所有匹配项。
- 使用pathconvert,将结果存储在一个属性中,用行分隔符分隔每个匹配的文件。
- 使用头部过滤器匹配第一个匹配文件。
这个功能被封装在一个macrodef中以保证可重用性。
<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>
我根据martin-clayton的回答创建了一个宏。
带有宏和从找到的文件
中读取的属性文件的示例项目<?xml version="1.0" encoding="utf-8"?>
<project name="test properties file read" default="info">
<macrodef name="searchfile">
<attribute name="file" />
<attribute name="path" default="custom,." />
<attribute name="name" />
<sequential>
<first id="@{name}">
<multirootfileset basedirs="@{path}" includes="@{file}" erroronmissingdir="false" />
</first>
<property name="@{name}" value="${toString:@{name}}" />
</sequential>
</macrodef>
<searchfile name="custom.properties.file" file="config.properties" />
<property file="${custom.properties.file}" />
<target name="info" >
<echo>
origin ${config.origin}
</echo>
</target>