2010-11-04 46 views
2

我在做的是找到一个NAnt文件。该文件可以位于给定文件夹的目录结构中的任何位置。Nant:按模式查找文件

我想这跟楠-的foreach任务(这工作),但我不太相信这一点:

<target name="find-file"> 
    <fail message="Property param.dir must be set" unless="${property::exists('param.dir')}" /> 
    <fail message="Property param.pattern must be set" unless="${property::exists('param.pattern')}" /> 

    <property name="return.file" value="" /> 
    <foreach item="File" property="iterator.file"> 
     <in> 
      <items> 
       <include name="${param.dir}\**\${param.pattern}" /> 
      </items> 
     </in> 
     <do> 
      <property name="return.file" value="${iterator.file}" if="${string::get-length(return.file) == 0}" /> 
     </do> 
    </foreach> 
</target> 

有没有人知道一个更好的方法吗?如果没有,我怎么能在完成第一个元素后退出foreach循环?

回答

4

This nantcontrib function will put the matching filenames into a delimited string.

如果你知道只有一个匹配文件存在,那么它可能会得到你想要的。如果有几个,则可以使用nant substring函数通过将子串取到第一个分隔符来获得第一个匹配。

下恶性脚本:

<?xml version="1.0" encoding="utf-8"?> 
<project default="find-file2"> 

    <property name="NantContrib.dir" value="C:\Program Files\nantcontrib-0.85\" readonly="true" /> 

    <target name="LoadNantContrib"> 
     <loadtasks assembly="${NantContrib.dir}bin\NAnt.Contrib.Tasks.dll" /> 
    </target> 

    <target name="find-file2" depends="LoadNantContrib"> 
     <fileset id="find.set"> 
      <include name="${param.dir}\**\${param.pattern}" /> 
     </fileset> 
     <property name="return.file" value="${fileset::to-string('find.set', ' | ')}" /> 
     <echo message="return.file=${return.file}"/> 
     <echo message="Found ${fileset::get-file-count('find.set')} files"/> 
    </target> 
</project> 

...和以下文件夹结构:

\---folderroot 
    +---folder1 
    |  dontfindme.txt 
    |  findme.txt 
    |  
    +---folder2 
    |  dontfindme.txt 
    |  
    \---folderempty 

...按预期工作。搜索findme.txt会查找一个文件。搜索dontfindme.txt找到两个文件。搜索* .txt会查找三个文件。

调用示例:

nant -D:param.dir=folderroot -D:param.pattern=findme.txt 

输出示例:

find-file2: 

    [echo] return.file=C:\Documents and Settings\rbaker\My Documents\nantfindfile\folderroot\folder1\findme.txt 
    [echo] Found 1 files 

BUILD SUCCEEDED 
+0

的恶性的contrib功能文件集::对字符串将不工作,除非有一种方法可以动态地在运行时创建的文件集(我不知道这些文件)。我的代码会得到第一个找到的文件,但我的问题是如何终止循环。 – Dennis 2010-11-23 09:24:33

+0

用示例更新。完美的作品。您提出了一种尽早终止循环的方法:我没有看到一个。你还要求更好的方法。这是否是更好的问题值得商榷 - 这当然是一个可行的选择。 – robaker 2010-11-23 11:51:58

+0

如果有多个文件匹配,它不会工作。 – Wernight 2011-10-26 12:27:09