Создание иерархии папок через FTP в Java

Есть ли доступная функциональность для Java для создания иерархии папок на удаленном FTP-сервере. Apache Commons предоставляет FTP-клиент, но я не могу найти метод для создания иерархии каталогов. Это позволяет создавать единый каталог (makeDirectory), но создание целого пути, похоже, не существует. Причина, по которой я хочу это, заключается в том, что иногда часть иерархии каталогов пока недоступна, и в таком случае я хочу создать недостающую часть иерархии, а затем перейти к этому вновь созданному каталогу.

Ответы

Ответ 1

Вам нужно использовать комбинацию FTPClient.changeWorkingDirectory, чтобы выяснить, существует ли каталог, а затем FTPClient.makeDirectory, если вызов FTPClient.changeWorkingDirectory возвращает false.

Вам нужно рекурсивно пройти дерево каталогов описанным выше способом на каждом уровне, создав каталог по мере необходимости.

Ответ 2

Нужно ответить на этот вопрос, поэтому я внедрил и протестировал некоторый код для создания каталогов по мере необходимости. Надеюсь, это поможет кому-то. ура! Аарон

/**
* utility to create an arbitrary directory hierarchy on the remote ftp server 
* @param client
* @param dirTree  the directory tree only delimited with / chars.  No file name!
* @throws Exception
*/
private static void ftpCreateDirectoryTree( FTPClient client, String dirTree ) throws IOException {

  boolean dirExists = true;

  //tokenize the string and attempt to change into each directory level.  If you cannot, then start creating.
  String[] directories = dirTree.split("/");
  for (String dir : directories ) {
    if (!dir.isEmpty() ) {
      if (dirExists) {
        dirExists = client.changeWorkingDirectory(dir);
      }
      if (!dirExists) {
        if (!client.makeDirectory(dir)) {
          throw new IOException("Unable to create remote directory '" + dir + "'.  error='" + client.getReplyString()+"'");
        }
        if (!client.changeWorkingDirectory(dir)) {
          throw new IOException("Unable to change into newly created remote directory '" + dir + "'.  error='" + client.getReplyString()+"'");
        }
      }
    }
  }     
}

Ответ 3

Apache Commons VFS (Virtual File System) может обращаться к нескольким различным файловым системам (среди них FTP), а также предоставляет метод createFolder, который может при необходимости создавать родительские каталоги:

http://commons.apache.org/vfs/apidocs/org/apache/commons/vfs/FileObject.html#createFolder%28%29

В документации указано, что метод "создает эту папку, если она не существует, а также создает любые папки-предки, которые не существуют. Этот метод ничего не делает, если папка уже существует".

Это может удовлетворить ваши потребности.

Ответ 4

Почему вы не можете использовать метод FTPClient # makeDirectory() для создания иерархии, по одной папке за раз?

Ответ 5

Используйте функцию ftpSession.mkdir для создания каталога.

@ManagedOperation
private void ftpMakeDirectory(FtpSession ftpSession, String fullDirFilePath) throws IOException {
if (!ftpSession.exists(fullDirFilePath)) {
  String[] allPathDirectories = fullDirFilePath.split("/");
  StringBuilder partialDirPath = new StringBuilder("");
  for (String eachDir : allPathDirectories) {
    partialDirPath.append("/").append(eachDir);

    ftpSession.mkdir(partialDirPath.toString());
  }

}