Ant w swoich poczynaniach task, w którym nie znajduje pliku, najczęściej po prostu pomija, a my nieświadomi nic o tym nie wiemy (na przykład poczas kopiowania). Czasem jednak chcielibyśmy coś o tym się dowiedzieć, a nie szukać później czego nam brakuje. Chcielibyśmy sprawdzić istnienie określonego pliku i porzucić błąd, kiedy takiego nie ma.
Najbardziej powszechne rozwiązanie, jakie możemy odnaleźć na różnych forach, przedstawia się mniej więcej tak:
<available file="filename" property="property.name" /> <fail unless="property.name" message="Plik nie istnieje" />
Co można określić jako: Jeżeli plik istnieje to załóż zmienną property.name (która zyska domyślna wartość true). Jeżeli zmienna nie istnieje (nie została założona), porzuć wyjątek.
Wadą tego rozwiązania jest to, że jeżeli mamy do sprawdzenia większą liczbę plików, to musimy dla każdego sprawdzenia wymyślić zmienną, którą chcemy utworzyć i zmienna taka musi być unikatowa. W przeciwnym bowiem wypadku ant poinformuje nas:
[available] DEPRECATED - <available> used to override an existing property. [available] Build file should not reuse the same property name for different values.
Efektem jest to, że raz ustalona zmienna zyskuje swą wartość i nie podlega dalszym zmianom.
Skutecznym rozwiązaniem tego faktu jest zastosowanie poniższego kodu, który nie wymaga od nas zakładania żadnych zmiennych, a wykonuje jedynie zwykłe sprawdzenie istnienia pliku.
<fail message="File xxx doesn't exist.">
<condition>
<not>
<available file="xxx"/>
</not>
</condition>
</fail>
Jednak nadal jest to jednostkowe zastosowanie i małopraktyczne. Dlatego kod taki najlepiej zdefiniować w małej makrodefinicji, którą będziemy mogli wykorzystywać:
<macrodef name="checkfile">
<attribute name="file" />
<sequential>
<fail message="File '@{file}' doesn't exist.">
<condition>
<not>
<available file="@{file}"/>
</not>
</condition>
</fail>
</sequential>
</macrodef>
Samo wykorzystanie sprowadza się wtedy do jednej linijki:
<checkfile file="xxx" />