【问题标题】:FTPClient cant get file listing from a directory name with spaceFTPClient 无法从带有空格的目录名称中获取文件列表
【发布时间】:2012-12-26 19:49:24
【问题描述】:

我正在使用 Apache FTPClient 来获取文件和子目录文件列表。但它无法从带有空格的目录名中获取文件列表。这是一个示例 - 我尝试使用两个不同的目录:

    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\“”。但仍然无法正常工作。我有什么遗漏吗?

【问题讨论】:

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

标签: java ftp apache-commons-net


【解决方案1】:

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

例如:

String path = "/Path/To/Folder With/Spaces";
path = path.replace(" ", "\\ ");
FTPFile[] listedDirectories = client.listDirectories(path);

【讨论】:

    【解决方案2】:

    我认为这可能是 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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      显然,虽然 listFiles(String path) 的路径包含空格,但其他函数没有类似问题。 您需要做的只是更改工作目录,然后使用 listFiles()。

      类似这样的:

      private FTPFile[] getDirectoryFiles(String dirPath) throws IOException
      {
          String cwd = ftp.printWorkingDirectory();
      
          ftp.changeWorkingDirectory(dirPath);
          FTPFile[] files = ftp.listFiles();
          ftp.changeWorkingDirectory(cwd);
      
          return files;               
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        相关资源
        最近更新 更多