2010-11-04 4 views
2

Ce que j'essaie de faire, est de trouver un fichier avec NAnt. Ce fichier pourrait être n'importe où dans une structure de répertoire d'un dossier donné.Nant: Trouver fichier par modèle

J'ai essayé de cela avec la tâche NAnt-foreach (cela fonctionne) mais je ne suis pas tout à fait convaincu de cela:

<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> 

Est-ce qu'il ya quelqu'un au courant d'une meilleure approche? Sinon comment puis-je accomplir pour quitter la boucle foreach après que le premier élément a été trouvé?

Répondre

4

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

Si vous savez qu'un seul fichier correspondant existera alors il peut vous obtenir ce que vous voulez. S'il y en a plusieurs, vous pouvez utiliser la fonction nant substring pour obtenir la première correspondance en prenant la sous-chaîne jusqu'au premier délimiteur.

Le script suivant Nant:

<?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> 

... et la structure du dossier suivant:

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

... fonctionne comme prévu. La recherche de findme.txt trouve un fichier. La recherche de dontfindme.txt trouve deux fichiers. La recherche de * .txt trouve trois fichiers.

Exemple d'appel:

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

Exemple de sortie:

find-file2: 

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

BUILD SUCCEEDED 
+0

La fonction contrib NAnt :: fileset à chaîne ne fonctionnera pas à moins qu'il y est un moyen de créer dynamiquement des ensembles de fichiers lors de l'exécution (I je ne connais pas les fichiers). Mon code va obtenir le premier fichier qui a été trouvé, mais ma question est de savoir comment terminer la boucle. – Dennis

+0

Mis à jour avec l'exemple. Fonctionne parfaitement. Vous avez demandé un moyen de terminer la boucle plus tôt: je n'en ai jamais vu. Vous avez également demandé une meilleure approche. C'est discutable, que ce soit meilleur ou non - c'est certainement une alternative viable. – robaker

+0

Si plus d'un fichier correspond, cela ne fonctionnera pas. – Wernight