Создать иерархию папок через FTP в Java - PullRequest
14 голосов
/ 02 ноября 2010

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

Ответы [ 5 ]

27 голосов
/ 30 сентября 2011

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

/**
* 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()+"'");
        }
      }
    }
  }     
}
20 голосов
/ 02 ноября 2010

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

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

2 голосов
/ 02 ноября 2010

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

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

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

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

2 голосов
/ 02 ноября 2010

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

0 голосов
/ 02 февраля 2016

Используйте функцию 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());
  }

}

...