[ 
https://issues.apache.org/jira/browse/NET-324?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kristof Neirynck updated NET-324:
---------------------------------

    Description: 
I'm trying to download files in subdirectories from an ftp server with ant. The 
exact set of files is known. Some of them are in subdirectories. Ant only seems 
to download the ones in the root directory. It does work if I download all 
files without listing them.

At first I thought I was doing something wrong so I posted a question on 
stackoverflow.
http://stackoverflow.com/questions/2790570/ant-ftp-doesnt-download-files-in-subdirectories

You can see my scriptdef workaround in the answers there.

The first ftp action should do the exact same thing as the second. Instead I 
get "Hidden file \\a\a.txt assumed to not be a symlink."

{code:title=build.xml}
<?xml version="1.0" encoding="utf-8"?>
<project name="example" default="example" basedir=".">
    <taskdef name="ftp" 
    classname="org.apache.tools.ant.taskdefs.optional.net.FTP" />

    <target name="example">

        <!-- doesn't work -->
        <ftp action="get" verbose="true"
        server="localhost" userid="example" password="example" 
        remotedir="">
            <fileset dir="downloads" casesensitive="false" 
            includes="a/a.txt,a/b/ab.txt,c/c.txt" />
        </ftp>

        <!-- works (but requires multiple ftp tasks) -->
        <ftp action="get" verbose="true"
        server="localhost" userid="example" password="example"
        remotedir="a">
            <fileset dir="downloads" casesensitive="false" 
            includes="a.txt,b/ab.txt" />
        </ftp>
        <ftp action="get" verbose="true"
        server="localhost" userid="example" password="example"
        remotedir="c">
            <fileset dir="downloads" casesensitive="false" 
            includes="c.txt" />
        </ftp>

    </target>

</project>
{code}


{code:title=build-with-workaround.xml}
<?xml version="1.0" encoding="utf-8"?>
<project name="example" default="example" basedir=".">
    <taskdef name="ftp" 
    classname="org.apache.tools.ant.taskdefs.optional.net.FTP" />

    <target name="example">
<scriptdef name="my-ftp-get" language="javascript">
    <attribute name="server"/>
    <attribute name="userid"/>
    <attribute name="password"/>
    <attribute name="remotedir"/>
    <attribute name="fileset_dir"/>
    <attribute name="fileset_includes"/>
    <![CDATA[
    importClass(java.io.File);
    importClass(org.apache.tools.ant.taskdefs.optional.net.FTP);
    var local_basedir = "" + attributes.get("fileset_dir") + "/";
    var original_includes = "" + attributes.get("fileset_includes");
    var remotedir = "" + attributes.get("remotedir");
    local_basedir = local_basedir.replace(/\\/g, "/");
    original_includes = original_includes.replace(/\\/g, "/");
    remotedir = remotedir.replace(/\\/g, "/");
    var includes_arr = original_includes.split(",");
    var clean_includes = {};
    for (var i = 0; i < includes_arr.length; i++) {
        var directory = "/";
        var filename = includes_arr[i];
        var split_include = includes_arr[i].split("/");
        if (split_include.length > 1) {
            directory = split_include[0] + "/";
            filename = includes_arr[i].substring(directory.length);
        }
        if (!clean_includes.hasOwnProperty(directory)) {
            clean_includes[directory] = [];
        }
        clean_includes[directory].push(filename);
    }
    var get_files = new FTP.Action();
    get_files.setValue("get");
    for (var path in clean_includes) {
        var current_clean_includes = clean_includes[path].join(",");
        var fileset = project.createDataType("fileset");
        var ftp = self.project.createTask("ftp");
        ftp.setAction(get_files);
        ftp.setServer(attributes.get("server"));
        ftp.setUserid(attributes.get("userid"));
        ftp.setPassword(attributes.get("password"));
        ftp.setRemotedir(remotedir + path);
        fileset.setDir(new File(local_basedir + path));
        fileset.setIncludes(current_clean_includes);
        ftp.addFileset(fileset);
        ftp.perform();
    }
    ]]>
</scriptdef>

<my-ftp-get
server="localhost" userid="example" password="example"
remotedir=""
    fileset_dir="downloads" casesensitive="false" 
    fileset_includes="a/a.txt,a/b/ab.txt,c/c.txt">
</my-ftp-get>

    </target>

</project>
{code}


  was:
I'm trying to download files in subdirectories from an ftp server with ant. The 
exact set of files is known. Some of them are in subdirectories. Ant only seems 
to download the ones in the root directory. It does work if I download all 
files without listing them.

At first I thought I was doing something wrong so I posted a question on 
stackoverflow.
http://stackoverflow.com/questions/2790570/ant-ftp-doesnt-download-files-in-subdirectories

You can see my scriptdef workaround in the answers there.

The first ftp action should do the exact same thing as the second. Instead I 
get "Hidden file \\a\a.txt assumed to not be a symlink."

{code:title=build.xml}
<?xml version="1.0" encoding="utf-8"?>
<project name="example" default="example" basedir=".">
    <taskdef name="ftp" 
    classname="org.apache.tools.ant.taskdefs.optional.net.FTP" />

    <target name="example">

        <!-- doesn't work -->
        <ftp action="get" verbose="true"
        server="localhost" userid="example" password="example" 
        remotedir="">
            <fileset dir="downloads" casesensitive="false" 
            includes="a/a.txt,a/b/ab.txt,c/c.txt" />
        </ftp>

        <!-- works (but requires multiple ftp tasks) -->
        <ftp action="get" verbose="true"
        server="localhost" userid="example" password="example"
        remotedir="a">
            <fileset dir="downloads" casesensitive="false" 
            includes="a.txt,b/ab.txt" />
        </ftp>
        <ftp action="get" verbose="true"
        server="localhost" userid="example" password="example"
        remotedir="c">
            <fileset dir="downloads" casesensitive="false" 
            includes="c.txt" />
        </ftp>

    </target>

</project>
{code}



added workaround code

> ant ftp doesn't download files in subdirectories when remotedir is empty or 
> root folder
> ---------------------------------------------------------------------------------------
>
>                 Key: NET-324
>                 URL: https://issues.apache.org/jira/browse/NET-324
>             Project: Commons Net
>          Issue Type: Bug
>    Affects Versions: 2.0
>         Environment: Windows 7, 64bit, apache-ant-1.8.1, commons-net-2.0, 
> jakarta-oro-2.0.8, FileZilla Server version 0.9.34 beta
>            Reporter: Kristof Neirynck
>            Priority: Minor
>
> I'm trying to download files in subdirectories from an ftp server with ant. 
> The exact set of files is known. Some of them are in subdirectories. Ant only 
> seems to download the ones in the root directory. It does work if I download 
> all files without listing them.
> At first I thought I was doing something wrong so I posted a question on 
> stackoverflow.
> http://stackoverflow.com/questions/2790570/ant-ftp-doesnt-download-files-in-subdirectories
> You can see my scriptdef workaround in the answers there.
> The first ftp action should do the exact same thing as the second. Instead I 
> get "Hidden file \\a\a.txt assumed to not be a symlink."
> {code:title=build.xml}
> <?xml version="1.0" encoding="utf-8"?>
> <project name="example" default="example" basedir=".">
>     <taskdef name="ftp" 
>     classname="org.apache.tools.ant.taskdefs.optional.net.FTP" />
>     <target name="example">
>         <!-- doesn't work -->
>         <ftp action="get" verbose="true"
>         server="localhost" userid="example" password="example" 
>         remotedir="">
>             <fileset dir="downloads" casesensitive="false" 
>             includes="a/a.txt,a/b/ab.txt,c/c.txt" />
>         </ftp>
>         <!-- works (but requires multiple ftp tasks) -->
>         <ftp action="get" verbose="true"
>         server="localhost" userid="example" password="example"
>         remotedir="a">
>             <fileset dir="downloads" casesensitive="false" 
>             includes="a.txt,b/ab.txt" />
>         </ftp>
>         <ftp action="get" verbose="true"
>         server="localhost" userid="example" password="example"
>         remotedir="c">
>             <fileset dir="downloads" casesensitive="false" 
>             includes="c.txt" />
>         </ftp>
>     </target>
> </project>
> {code}
> {code:title=build-with-workaround.xml}
> <?xml version="1.0" encoding="utf-8"?>
> <project name="example" default="example" basedir=".">
>     <taskdef name="ftp" 
>     classname="org.apache.tools.ant.taskdefs.optional.net.FTP" />
>     <target name="example">
> <scriptdef name="my-ftp-get" language="javascript">
>     <attribute name="server"/>
>     <attribute name="userid"/>
>     <attribute name="password"/>
>     <attribute name="remotedir"/>
>     <attribute name="fileset_dir"/>
>     <attribute name="fileset_includes"/>
>     <![CDATA[
>     importClass(java.io.File);
>     importClass(org.apache.tools.ant.taskdefs.optional.net.FTP);
>     var local_basedir = "" + attributes.get("fileset_dir") + "/";
>     var original_includes = "" + attributes.get("fileset_includes");
>     var remotedir = "" + attributes.get("remotedir");
>     local_basedir = local_basedir.replace(/\\/g, "/");
>     original_includes = original_includes.replace(/\\/g, "/");
>     remotedir = remotedir.replace(/\\/g, "/");
>     var includes_arr = original_includes.split(",");
>     var clean_includes = {};
>     for (var i = 0; i < includes_arr.length; i++) {
>         var directory = "/";
>         var filename = includes_arr[i];
>         var split_include = includes_arr[i].split("/");
>         if (split_include.length > 1) {
>             directory = split_include[0] + "/";
>             filename = includes_arr[i].substring(directory.length);
>         }
>         if (!clean_includes.hasOwnProperty(directory)) {
>             clean_includes[directory] = [];
>         }
>         clean_includes[directory].push(filename);
>     }
>     var get_files = new FTP.Action();
>     get_files.setValue("get");
>     for (var path in clean_includes) {
>         var current_clean_includes = clean_includes[path].join(",");
>         var fileset = project.createDataType("fileset");
>         var ftp = self.project.createTask("ftp");
>         ftp.setAction(get_files);
>         ftp.setServer(attributes.get("server"));
>         ftp.setUserid(attributes.get("userid"));
>         ftp.setPassword(attributes.get("password"));
>         ftp.setRemotedir(remotedir + path);
>         fileset.setDir(new File(local_basedir + path));
>         fileset.setIncludes(current_clean_includes);
>         ftp.addFileset(fileset);
>         ftp.perform();
>     }
>     ]]>
> </scriptdef>
> <my-ftp-get
> server="localhost" userid="example" password="example"
> remotedir=""
>     fileset_dir="downloads" casesensitive="false" 
>     fileset_includes="a/a.txt,a/b/ab.txt,c/c.txt">
> </my-ftp-get>
>     </target>
> </project>
> {code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to