【问题标题】:Trying to get the filenames of all files in a directory with ANT尝试使用 ANT 获取目录中所有文件的文件名
【发布时间】:2011-12-16 16:42:52
【问题描述】:

例如

/test/a.jar
/test/b.jar
/test/c.jar

output:
a.jar
b.jar
c.jar

这在大多数情况下都有效,除了它似乎只获取其中一个文件,而不是全部 =/

       <for param="file">
            <path>
                <fileset dir="${test.dir}/lib">
                    <include name="**/*.jar"/>
                </fileset>
            </path>
            <sequential>
                <basename property="filename" file="@{file}"/>
                <echo message="${filename}"/>
            </sequential>
        </for>

这让我很感动:

c.jar
c.jar
c.jar

【问题讨论】:

    标签: ant


    【解决方案1】:

    您遇到的问题是 Ant 属性的不变性 - 一旦设置了属性,该值通常无法更改。

    第一次在循环中设置 filename 属性,并且该值“坚持”。

    从 Ant 1.8 开始,local task 允许您将属性本地化到当前执行块。例如,您的 sequential 将是:

    <sequential>
        <local name="filename" />
        <basename property="filename" file="@{file}"/>
        <echo message="${filename}"/>
    </sequential>
    

    Ant 忘记了序列末尾的属性,因此可以在每次迭代中使用一个新值。

    【讨论】:

      【解决方案2】:

      我已经有一段时间没有用 ant 做任何事情了,但是你尝试过 foreach 吗?

         <foreach>
              <fileset dir="${test.dir}/lib">
                  <include name="**/*.jar"/>
              </fileset>
              <echo message="${foreach.file}"/>
         </foreach>
      

      【讨论】:

      • foreach 不允许嵌套回显 :( 我想将文件名输出到文件中,因此非常需要回显到文件中。我无法将它们存储在列表中,因为数字的文件可以更改。
      • hmm.. 看看这个答案,也许它会有所帮助:stackoverflow.com/questions/1467991/…
      • 是的,我一直在通读,我刚刚做了一个执行 ls > out.txt 的 exec :)
      【解决方案3】:

      这是我列出目录中文件的方式。

      <fileset id="filesref" dir="path/to/dir" includes="*"/>
      <property name="files" refid="filesref"/>
      
      <echo message="Files:${line.separator}" />
      <for list="${files}" delimiter=";" param="file" >
          <sequential>
              <echo message="    @{file}"/>
              <!--Do more stuff with the file's name here-->
          </sequential>
      </for>
      

      【讨论】:

        【解决方案4】:

        获取文件名列表及其大小。

        E:\ANT>ant -buildfile=nashornFileNames.xml
        Buildfile: E:\ANT\nashornFileNames.xml
        
        <?xml version="1.0" encoding="ISO-8859-1"?>
        <project name="MyProject" basedir="." default="fileNames">
        
            <property environment="env"/>
            <property name="library.file" value="E:\\ANT\\JAR"/>
        
        
            <condition property="fileSep" value="\"><os family="windows"/></condition>
            <condition property="fileSep" value="/"><os family="unix"/></condition>
        
            <target name="fileNames" depends="showEnv">
                <!-- script run both on rhino and nashorn -->
                <script language="javascript"> <![CDATA[
                    // "nashorn:" pseudo URL scheme for nashorn's built-in scripts.
                    // To support Rhino load Mozilla compatibility script - which defines global functions like importPackage, importClass for rhino compatibility.
                    load("nashorn:mozilla_compat.js");
        
                    // Accessing Java packages and classes from script. Nashorn's recommended way to access Java classes is to use Java.type.
                    importPackage(java.io) // Rhino extensions: importPackage global function
                    importClass(java.lang.System); // Rhino extensions:  global.importClass
        
                    var File = java.io.File; // Rhino way!
                    var String = Java.type("java.lang.String"); // Nashorn way!
        
                    // Access to Ant-Properties by their names
                    basedir  = self.getProject().getProperty("basedir");
                    fileSep  = project.getProperty("fileSep");
                    System.out.println(" [script command-line] Java API : " + fileSep);
        
                    // create and use a Task via Ant API
                    echo = self.getProject().createTask("echo");
                    function setMessage( msg ) {
                        echo.setMessage( msg );
                        echo.perform();
                    }
                    setMessage("[echo Task] Ant API : " + basedir );
        
                        // <fileset dir="" includes=""/> « https://ant.apache.org/manual/Types/fileset.html
                        var fileset = project.createDataType("fileset");
        
                        files  = project.getProperty("library.file");
                        setMessage("files: " + files);
                        fileset.setDir( new File( files ) );
                        fileset.setIncludes("**/*.jar");
        
                    // Get the files (array) of that fileset
                    ds = fileset.getDirectoryScanner( self.getProject() );
        
                    fileset_files = ds.getIncludedFiles(); // Get only the files
        
                    // iterate over that array
                    for (i=0; i < fileset_files.length; i++) {
        
                        var basedir  = fileset.getDir( self.getProject() );
                        var filePath = fileset_files[i];
                        var folders = filePath.split(fileSep).slice(0,-1).join(fileSep);
                        var fileName = filePath.split(fileSep).slice(-1)[0];
                        var file = new File(basedir, filePath);
                        var fileSize = file.length();
        
                        setMessage(folders + "« FileName : "+ fileName +" : " + fileSize + " byte");
                    }
                ]]></script>
            </target>
            <target name="showEnv">
                <echo message="java.io.tmpdir = ${java.io.tmpdir}"/>
                <echo message="windows tmpdir = ${env.TMP}"/>
                <echo message="windows JAVA_HOME = ${env.JAVA_HOME}"/>
                <echo message="windows ANT_HOME = ${env.ANT_HOME}"/>
            </target>
        </project>
        

        Oracle Nashorn 作为命令行工具和 Java 应用程序中的嵌入式解释器wiki

        Nashorn 是由 Oracle 以 Java 编程语言开发的 JavaScriptECMA 兼容 引擎。它基于Da Vinci Machine (JSR 292) 并随 Java 8 一起发布。_ jdk.nashorn.api.scripting.NashornScriptEngine openjdk

        在 Java SE 7 之前,JDK 附带了基于 Mozilla Rhino 的 JavaScript 脚本引擎。 Java SE 8 将搭载一个名为 Oracle Nashorn 的新引擎,该引擎基于 JSR 292 和 invokedynamic。它通过调用动态绑定的调用站点更好地遵守 ECMA 规范化 JavaScript 规范和更好的运行时性能。

        Nashorn extensions 和一些 Rhino 特定的扩展已经被 nashorn 支持。 前任:

        var String = Java.type("java.lang.String"); // Nashorn way!
        var Array = java.lang.reflect.Array // Rhino way!
        
        // collections are interpreted as arrays.
        var arr = [ "hello", "world" ];
        var list = Java.to(array, Java.type("java.util.List"))
        

        只有加载 nashorn 提供的兼容性脚本时,才会支持少数 Rhino/Mozilla 扩展。使用 "load('nashorn:mozilla_compat.js") 加载兼容性脚本

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 2012-01-10
          • 1970-01-01
          • 1970-01-01
          • 2011-02-24
          • 1970-01-01
          相关资源
          最近更新 更多