Задача Ant, чтобы определить, доступен ли файл только для чтения - PullRequest
2 голосов
/ 17 мая 2011

Мне нужно написать задачу ant, чтобы определить, доступен ли определенный файл только для чтения, и если это так, произойдет сбой.Я хотел бы избежать использования специального селектора, чтобы сделать это в соответствии с природой нашей системы сборки.У кого-нибудь есть идеи, как это сделать?Я использую ant 1.8 + ant-contrib.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 17 мая 2011

Будет ли что-то подобное делать свое дело?

<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 и условие isfileselected (не прямая ссылка - вам придется искать вниз по странице) в сочетании с writable селектор (и обратный с условием not).

Обновление:

Возможно, лучшей альтернативой будет:

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

Это проверка и сбой как одно отдельное действие, а не два, так что вы можете найти его более понятным, и для него не нужно использовать имя свойства, поэтому ваше пространство имен чище.

0 голосов
/ 17 мая 2011

А как насчет написания пользовательского условия , которое будет использоваться задачей условие ?Он более гибкий.

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>
0 голосов
/ 17 мая 2011

Я уверен, что есть лучшие способы, но я добавлю несколько возможных методов.

  • Используйте задачу копирования, чтобы создать временную копию, затем попытайтесь скопировать этот файл, чтобы перезаписатьоригинал.Атрибут failonerror пригодится
  • Используйте задачу Java для выполнения задачи, которая выполняет некоторый простой код, такой как:

    Файл f = новый файл (путь);f.canWrite () ......

...