2011-12-20 39 views
7

Tôi muốn tìm đường dẫn tệp trong thư mục (tương tự như lệnh unix 'find' hoặc lệnh 'which', nhưng tôi cần nó để làm việc độc lập với nền tảng) và lưu nó dưới dạng tài sản.Ant: Tìm đường dẫn của tệp trong thư mục

Đã cố gắng sử dụng nhiệm vụ kiến ​​whichresource nhưng không thực hiện được việc lừa (tôi nghĩ nó chỉ tốt cho việc tìm kiếm trong tệp jar).

Tôi thích nếu đó là kiến ​​thuần túy và không viết nhiệm vụ của riêng tôi hoặc sử dụng tiện ích của bên thứ ba.

Lưu ý rằng có thể có một vài phiên bản của tệp theo tên đó trong đường dẫn - tôi muốn nó chỉ trả lại phiên bản đầu tiên (hoặc ít nhất tôi muốn có thể chọn chỉ một).

Mọi đề xuất?

Trả lời

21

Một khả năng là sử dụng bộ chọn tài nguyên first. Ví dụ để tìm một tập tin gọi là a.jar đâu đó dưới thư mục jars:

<first id="first"> 
    <fileset dir="jars" includes="**/a.jar" /> 
</first> 
<echo message="${toString:first}" /> 

Nếu không có file phù hợp với không có gì sẽ được lặp lại, nếu không bạn sẽ nhận được các đường dẫn đến các trận đấu đầu tiên.

+0

+1 Nhiều chỗ ngồi hơn tôi :) – sudocode

+0

Tuyệt vời! Điều đó hoạt động tuyệt vời! Bạn có thể giải thích những gì nó 'toString:' thingie? – yonix

+3

Nó chỉ là một cách để 'xâu chuỗi' một loại Ant. Xem http://ant.apache.org/manual/properties.html#toString –

7

Dưới đây là ví dụ lựa chọn tệp phù hợp đầu tiên. Logic là như sau:

  • tìm tất cả các kết quả phù hợp bằng cách sử dụng fileset.
  • sử dụng pathconvert, lưu trữ kết quả trong thuộc tính, tách từng tệp phù hợp với dấu tách dòng.
  • sử dụng head filter để khớp với tệp khớp đầu tiên.

Chức năng được đóng gói trong macrodef để có thể sử dụng lại.

<project default="test"> 

    <target name="test"> 
    <find dir="test" name="*" property="match.1"/> 
    <echo message="found: ${match.1}"/> 
    <find dir="test" name="*.html" property="match.2"/> 
    <echo message="found: ${match.2}"/> 
    </target> 

    <macrodef name="find"> 
    <attribute name="dir"/> 
    <attribute name="name"/> 
    <attribute name="property"/> 
    <sequential> 
     <pathconvert property="@{property}.matches" pathsep="${line.separator}"> 
     <fileset dir="@{dir}"> 
      <include name="@{name}"/> 
     </fileset> 
     </pathconvert> 
     <loadresource property="@{property}"> 
     <string value="${@{property}.matches}"/> 
     <filterchain> 
      <headfilter lines="1"/> 
     </filterchain> 
     </loadresource> 
    </sequential> 
    </macrodef> 

</project> 
+0

macrodef khá thú vị - +1 cho điều đó :) – yonix

Các vấn đề liên quan