Java FTPClient无法从带有空格的目录名中获取文件列表

Java FTPClient无法从带有空格的目录名中获取文件列表,java,ftp,apache-commons-net,Java,Ftp,Apache Commons Net,我使用ApacheFTPClient获取文件和子目录文件列表。但它无法从带有空格的目录名中获取文件列表。下面是一个示例-我用两个不同的目录进行了尝试: FTPClient client = new org.apache.commons.net.ftp.FTPClient(); client.connect("ftp.domain.com"); client.login("userid", "password"); FTPFile[] names = client

我使用ApacheFTPClient获取文件和子目录文件列表。但它无法从带有空格的目录名中获取文件列表。下面是一个示例-我用两个不同的目录进行了尝试:

    FTPClient client = new org.apache.commons.net.ftp.FTPClient();
    client.connect("ftp.domain.com");
    client.login("userid", "password");

    FTPFile[] names = client.listDirectories("ABC XYZ"); //Empty array
    FTPFile[] names2 = client.listDirectories("ABCXYZ"); //working

所以目录名和空格不返回任何内容。我试着把“%20”和“+”放在空格处。我也试过“ABC XYZ”。但仍然不起作用。我遗漏了什么。

我认为这可能是Apache Commons的问题,它对我不起作用,事实上它可能不起作用,因为空格被解释为命令参数的分隔符。我找不到解决您问题的方法,我所能做的就是向您建议解决方法:

FTPClient client = new org.apache.commons.net.ftp.FTPClient();
client.connect("ftp.domain.com");
client.login("userid", "password");

client.cwd("ABC XYZ");
FTPFile[] names = client.listDirectories(); //now this should work, it works for me
client.cdup();
FTPFile[] names2 = client.listDirectories("ABCXYZ"); //working
如果您不想在每次有一个名称中带有空格的目录时写入此内容,您可以创建一个方法来为您执行此操作:

FTPFile[] listDirectories(String directory){
    if(directory.contains(" ")){
        client.cwd(directory);
        FTPFile[] listedDirectories = client.listDirectories();
        client.cdup();
        return listedDirectories;
    } else {
        return client.listDirectories(directory);
    }
}

这是一个老问题,但我最近遇到了这个问题,并找到了一个似乎适合我的解决方案。使用转义字符“\”转义空格

例如:

String path = "/Path/To/Folder With/Spaces";
path = path.replace(" ", "\\ ");
FTPFile[] listedDirectories = client.listDirectories(path);
显然,虽然listFiles(stringpath)在包含空格的路径上有问题,但其他函数没有类似的问题。 您需要做的只是更改工作目录,然后使用listFiles()

大概是这样的:

private FTPFile[] getDirectoryFiles(String dirPath) throws IOException
{
    String cwd = ftp.printWorkingDirectory();

    ftp.changeWorkingDirectory(dirPath);
    FTPFile[] files = ftp.listFiles();
    ftp.changeWorkingDirectory(cwd);

    return files;               
}

您确定要查找的目录
ABC XYZ
存在吗?@JimGarrison是的,它存在。我可以用其他ftp管理器甚至浏览器打开它。目录
ABC XYZ
是否包含子目录?这就是你在这里要求的。也许你想使用
listFiles()
?@JimGarrison是的,它包含很多子目录和文件。虽然这并不重要,因为它至少应该返回2个目录-“.”和“..”。我猜实际的系统类型与客户端使用的系统类型不匹配。这可能会导致使用错误的
FTPFileEntryParser
实现。查看
FTPClientConfig
FTPClient#setParserFactory()