4

私はzipファイルと、それとは別に、いくつかのファイルを含むディレクトリを持っています。zipファイルから、ディレクトリに存在するファイルのみを抽出したいと思います(ファイルが抽出されるときにファイル名変換を実行します..基本的に、それらのファイルのバックアップを作成しています)。

<present> 要素を持つファイルセットを持つ <copy> で同様のことをしても問題はありませんが、unzip ではうまくいかないようです:

<unzip src="${cur.srcdir.live}" dest="${cur.srcdir.archive-files.dir}" overwrite="true">
    <fileset dir=".">
        <present present="both" targetdir="${cur.srcdir}" />
        <type type="file" />
    </fileset>
    <globmapper from="*" to="*.${backup.suffix}" />
</unzip>

誰かが前にこのようなことをしたことがありますか? これは Ant 1.8.0 です。ありがとう!

4

3 に答える 3

2

<copy> で使用できる <present> セレクターを「偽造」することで、問題を解決できました。方法は次のとおりです。

最初に、pathconvert を使用してフォルダー内のファイルのリストを作成しました。

    <pathconvert property="extract.list" pathsep="&#xA;">
        <path>
            <fileset dir="${extract.src.dir}" includes="${extract.src.dir.relpath}">
                <type type="file" />
            </fileset>
        </path>
        <map from="${extract.src.dir}\" to="" />
    </pathconvert>

マップのユーザーがリストを絶対パスではなく相対パスにすることに注意してください。さらに、区切り文字は改行です。

次に、このリストがファイルに書き込まれます。

    <echo file="${props.tmp.file}" message="~~~~noop~~~~&#xA;${extract.list}" append="false" />

ファイルに常に少なくとも1行あるように、そこに「nooop」エントリを入れました。これは、これを includefile として使用する次のステップのために重要です。includesfile が空の場合、Ant はそれを「何でも許可する」と解釈します...しかし、空のリストの結果、zip から何も抽出されないようにしたいと考えています。

最後のステップは、上記の一時ファイルをインクルード ファイルとして使用して、zip から抽出することです。globmapper は、抽出時にファイルの名前を適切なバックアップ名に変更します。

    <unzip src="${extract.archive}" dest="${extract.dest.dir}" overwrite="true">
        <patternset>
            <includesfile name="${props.tmp.file}" />
        </patternset>
        <globmapper from="*" to="*.${backup.suffix}" />
    </unzip>
于 2011-10-19T16:38:10.850 に答える
1

execタスクを介してunzipコマンドを呼び出してみることができます。
変更されたファイルのみを更新するWindowsでチェックしたサンプルdest.folder

<property name="zip.file_name" value="Archive.zip"/>
<property name="src.folder" value="d:\"/>
<property name="dest.folder" value="d:\55"/>

<target name="unzip">
    <echo>unzip -fo ${src.folder}${zip.file_name}</echo>
    <exec dir="${dest.folder}" executable="cmd.exe" output="${src.folder}operation_result.txt">

        <arg line="/c unzip -fo ${src.folder}${zip.file_name}"/>
    </exec>
</target>

元のファイルを保持したい場合は、次のコマンドを使用できます。

<arg line="/c unzip -foB ${src.folder}${zip.file_name}"/>

パラメータを使用する場合-B、元のファイル(フォルダに保存されている)の名前が変更されます-チルダ記号が追加されます。アーカイブと古い元のファイルから抽出された2セットのファイルを取得します。
その後、moveタスクを使用してファイルの名前を変更できます。

于 2011-10-18T05:48:28.393 に答える