Ant任务,用于确定文件是否为只读文件

时间:2011-05-16 20:58:49

标签: ant build readonly build.xml ant-contrib

我需要编写一个ant任务来确定某个文件是否只读,如果是,则失败。我想避免使用自定义选择器来完成构建系统的性质。任何人有任何想法如何去做这个?我正在使用ant 1.8 + ant-contrib。

谢谢!

3 个答案:

答案 0 :(得分:3)

这样的事情能做到吗?

<condition property="file.is.readonly">
  <not>
    <isfileselected file="${the.file.in.question}">
      <writable />
    </isfileselected>
  </not>
</condition>
<fail if="file.is.readonly" message="${the.file.in.question} is not writeable" />

这会使用condition taskisfileselected condition(不是直接链接 - 您必须在页面下搜索)与writable selector相结合(并以{{1条件)。

更新

可能更好的选择是:

not

这将检查和失败作为一个不同的操作而不是两个,因此您可能会发现它更清晰,并且它不需要使用属性名称,因此您的命名空间更清晰。

答案 1 :(得分:0)

我确信有更好的方法,但我会抛出一些可能的方法。

  • 使用复制任务创建临时副本,然后尝试复制此文件以覆盖原始文件。 failonerror属性将派上用场
  • 使用java任务执行执行某些简单代码的任务,例如:

    文件f =新文件(路径); f.canWrite()......

答案 2 :(得分:0)

编写custom condition任务使用condition怎么样?它更灵活。

public class IsReadOnly extends ProjectComponent implements Condition
{
  private Resource resource;

  /**
   * The resource to test.
   */
  public void add(Resource r) {
    if (resource != null) {
        throw new BuildException("only one resource can be tested");
    }
    resource = r;
  }

  /**
   * Argument validation.
   */
  protected void validate() throws BuildException {
    if (resource == null) {
        throw new BuildException("resource is required");
    }
  }

  public boolean eval() {
    validate();
    if (resource instanceof FileProvider) {
      return !((FileProvider)resource).getFile().canWrite();
    }
    try {
      resource.getOutputStream();
      return false;
    } catch (FileNotFoundException no) {
      return false;
    } catch (IOException no) {
      return true;
    }
  }
}

整合
<typedef
  name="isreadonly"
  classname="IsReadOnly"
  classpath="${myclasses}"/>

并像

一样使用它
<condition property="readonly">
  <isreadonly>
    <file file="${file}"/>
  </isreadonly>
</condition>