【问题标题】:Ant get file creation timestampAnt获取文件创建时间戳
【发布时间】:2013-01-20 18:36:11
【问题描述】:

我正在为 OpenCMS 项目的 Ant 构建期间编写一个 manifest.xml 文件。

我需要能够提取文件的创建日期和文件的最后修改日期。 (尽管当前进程给每个文件一个时间戳Wed, 31 Dec 1969 19:00:00 EST 无论如何——至少在 Windows 机器上运行构建时。)

有没有办法在 Ant 中提取文件的创建日期时间戳?我正在使用标准 Ant 任务和 Ant-Contrib 任务。

【问题讨论】:

  • 这是一个类似的问题,解决方案基于 Tasksuite Ant Flaka => stackoverflow.com/a/5992436/130683
  • @Rebse 谢谢,我看到了。但是,我没有安装 Flacka。我希望有人知道使用<script><scriptdef> 的方法。

标签: ant


【解决方案1】:

我有这个工作。

正如Mark O'Connor 指出的那样,您无法从早期版本的Java 中获取文件创建时间。但是,用于此任务的原始 Java 程序对创建日期和上次修改日期都使用了 lastModified 方法1。我做同样的事情很好。

我创建了一个<scriptdef> 来从文件中提取上次修改日期。在 Java 1.6 及更高版本中,您可以直接访问 Rhino JavaScript 库,因此您不再需要 BeanShell 库。

<scriptdef name="file.mdate" language="javascript"> 
    <attribute name="file"/> 
    <attribute name="property"/> 
        file_name = attributes.get("file"); 
        property_to_set = attributes.get("property");

        file = new java.io.File(file_name); 
        file_date = file.lastModified();

        date_format = new java.text.SimpleDateFormat("EEE, dd MMM YYYY HH:mm:ss zzz");
        formated_date = date_format.format(new java.util.Date(file_date));
        project.setNewProperty(property_to_set, formated_date);
</scriptdef> 

定义后,我可以将其用作 Ant 任务:

<file.mdate
    file="${file.name}"
    property="file.modified.date"/>
<echo>The file "${file}" was modified on ${file.modified.date}</echo>

【讨论】:

  • 如果 OS==Windows,您可以通过系统命令获取创建时间,请参阅我的回答。
  • 这个解决方案很好,简洁明了。不需要第三方库 Groovy。只需要设置文件的属性,例如:。它应该适用于任何系统。特别是,我在我的 macbook 中运行它。它非常完美。非常感谢!
【解决方案2】:

这取决于您的操作系统,例如Unix 不存储文件创建时间,see details here
两种可能的解决方案:

解决方案 1,仅适用于 Java >= 6 的 Windows,无需插件

<project>
  <!-- Works on Windows only, uses the jdk builtin
       rhino javascript engine (since jdk6)
       use dir command without /T:C to get lastmodificationtime
  -->
  <macrodef name="getFileTimes">
    <attribute name="dir" />
    <attribute name="file" />
    <attribute name="setprop" default="@{file}_ctime" />
    <sequential>
      <exec executable="cmd" dir="@{dir}" outputproperty="@{setprop}">
        <arg value="/c" />
        <arg line="dir @{file} /T:C|find ' @{file}'" />
      </exec>
      <script language="javascript">
     tmp = project.getProperty("@{setprop}").split("\\s+") ;
     project.setProperty("@{setprop}", tmp[0] + "/" + tmp[1]) ;
   </script>
    </sequential>
  </macrodef>

  <getFileTimes dir="C:/tmp" file="bookmarks.html" />

  <echo>
  $${bookmarks.html_ctime} => ${bookmarks.html_ctime}
  </echo>
</project>

解决方案 2,需要 Java 7 和 groovy-all-x.x.x.jar(包含在 groovy binary release 中)
根据自己的喜好调整 SimpleDateFormat。
在 Unix 文件系统上,当询问创建时间时,您将获得最后修改时间。

<project>
  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/>

  <!-- Solution for Java 7, uses the nio package
       needs groovy-all-2.1.0.jar
  -->
  <macrodef name="getFileTimes">
    <attribute name="file"/>
    <attribute name="ctimeprop" default="@{file}_ctime"/>
    <attribute name="mtimeprop" default="@{file}_mtime"/>
    <sequential>
      <groovy>
      import java.nio.file.*
      import java.nio.file.attribute.*
      import java.text.*
      import java.util.date.*

      Path path = Paths.get("@{file}")
      BasicFileAttributeView view = Files.getFileAttributeView(path, BasicFileAttributeView.class)
      BasicFileAttributes attributes = view.readAttributes()
      lastModifiedTime = attributes.lastModifiedTime()
      createTime = attributes.creationTime()
      DateFormat df = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss", Locale.US)
      df.format(new Date(createTime.toMillis()))

      properties.'@{ctimeprop}' = df.format(new Date(createTime.toMillis()))
      properties.'@{mtimeprop}' = df.format(new Date(lastModifiedTime.toMillis()))
     </groovy>
    </sequential>
  </macrodef>

  <getFileTimes file="C:/tmp/bookmarks.html"/>

  <echo>
    $${C:/tmp/bookmarks.html_ctime} => ${C:/tmp/bookmarks.html_ctime}
    $${C:/tmp/bookmarks.html_mtime} => ${C:/tmp/bookmarks.html_mtime}
  </echo>
</project>

我也尝试使用内置的 javascript 引擎,但出现如下错误:

sun.org.mozilla.javascript.internal.EvaluatorException: missing name after . operator

IMO,对于简单的事情,使用 javascript &lt;script language="javascript"&gt; 就足够了,但如果你需要导入 java 包等......它是一个 PITA。 Groovy 很简单。

【讨论】:

  • 实际上,Java 1.6 及更高版本中内置的 Rhino JavaScript 引擎可让您访问 Java 对象。我真的没有问题。我尝试了纯 JavaScript,但在线文档很糟糕。 Java 文档要好得多。我可以在 Unix 中使用 &lt;exec&gt; 获得 cdate ,但这很不确定。此外,我们的官方构建是在位于 Unix 服务器上的 Jenkins 上完成的。感谢您的回答。 Java 1.7 可能是一个选项。不过,我们目前已经在 J​​ava 1.6 上进行了标准化。
  • 即使我没有使用这个,我仍然喜欢你的回答,所以我给你的功劳。
  • 获取 unix 创建时间取决于使用的文件系统,f.e.看这里stackoverflow.com/questions/10171069/file-creation-time-in-unix
  • 经过 2 次扩展(2012 年 7 月 -> 2012 年 11 月 -> 2013 年 2 月)后 Java 6 的 EOL => blogs.oracle.com/henrik/entry/updated_java_6_eol_date
  • 生命终结?我的 Mac 仍然像大多数 Mac 一样运行 JDK 1.6.0_37。而且,我公司终于正式祝福JDK 1.6了。去年,我在一家仍在使用 JDK 1.3 的公司工作。我相信 Red Hat 仍然有 1.6 作为他们官方支持的版本。当您谈论庞大的业务系统时,很难让它们改变任何东西。我在我的 Windows 7 上安装了 1.7(我拥有的第一台 Win7 PC。去年仍然是 XP),我们正在对其进行测试。也许我们会在 1.8 EOL 结束之前转移到 1.7。
【解决方案3】:

问题是标准Java File 对象只支持返回最后修改日期的方法:

Java 7 使用新的 NIO 类解决了这个问题:

显然,要在 ANT 中利用这一点,您需要编写自定义任务或嵌入脚本。

【讨论】:

    【解决方案4】:

    David W.s answer 中有一个错误: 它在第二次运行时不起作用,因为该属性在第二次运行时不会被覆盖。

    更改:project.setNewProperty 应为 project.setProperty

    完整代码sn-p:

    <scriptdef name="filedate" language="javascript">
        <attribute name="file"/>
        <attribute name="property"/>
            <![CDATA[
                file_name = attributes.get("file");
                property_to_set = attributes.get("property");
    
                file = new java.io.File(file_name);
                file_date = file.lastModified();
    
                date_format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                formated_date = date_format.format(new java.util.Date(file_date));
                project.setProperty(property_to_set, formated_date);
            ]]>
    </scriptdef>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2020-01-05
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多