{"record":{"id":"9360a9e5a6e39418","repo":"pentaho/pentaho-kettle","slug":"jobftps-error-creationfolder","errorCode":"JobFTPS.Error.CreationFolder","errorMessage":"JobFTPS.Error.CreationFolder","messagePattern":"JobFTPS\\.Error\\.CreationFolder","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/ftps/impl/src/main/java/org/pentaho/di/job/entries/ftpsget/FTPSConnection.java","lineNumber":410,"sourceCode":"      this.connection.changeDirectory( directory );\n    } catch ( Exception f ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"JobFTPS.Error.ChangingFolder\", directory ), f );\n    }\n  }\n\n  /**\n   *\n   * this method is used to create a directory in remote host\n   *\n   * @param directory\n   *          directory name on remote host\n   * @throws KettleException\n   */\n  public void createDirectory( String directory ) throws KettleException {\n    try {\n      this.connection.makeDirectory( directory );\n    } catch ( Exception f ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"JobFTPS.Error.CreationFolder\", directory ), f );\n    }\n  }\n\n  public List<FTPFile> getFileList( String folder ) throws KettleException {\n    try {\n      if ( connection != null ) {\n        List<FTPFile> response = connection.getDirectoryListing( folder );\n        return response;\n      } else {\n        return null;\n      }\n    } catch ( Exception e ) {\n      throw new KettleException( e );\n    }\n  }\n\n  /**\n   * this method is used to download a file from a remote host","sourceCodeStart":392,"sourceCodeEnd":428,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/ftps/impl/src/main/java/org/pentaho/di/job/entries/ftpsget/FTPSConnection.java#L392-L428","documentation":"KettleException thrown by FTPSConnection.createDirectory when the underlying FTPS client's makeDirectory call fails for the given remote path. It wraps any exception (IO, SSL, server reply) raised while creating a folder on the FTPS server.","triggerScenarios":"calling createDirectory(directory) when the remote path is invalid, the parent folder does not exist, the server refuses MKD, or the control connection/SSL session has dropped","commonSituations":"job entry configured with a non-existent parent path for 'move to folder'; FTPS server denies directory creation permissions; passive-mode firewall issues causing connection drop before MKD","solutions":["Verify the parent directory of the target path already exists on the FTPS server (create parents first)","Check the FTPS user's write/create permissions on the server","Test the same MKD command manually with an FTPS client (e.g. lftp, FileZilla) to see the raw server reply","Ensure the connection is still alive (passive mode / firewall timeouts) before calling createDirectory"],"exampleFix":"// before\nconnection.createDirectory(\"/data/out/daily/\");\n// after\nconnection.createDirectory(\"/data/out\");      // ensure parent exists\nconnection.createDirectory(\"/data/out/daily\");","handlingStrategy":"try-catch","validationCode":"// pre-check parent dir exists via file listing\nList<FTPFile> files = connection.getFileList(\"/data/out\");\nif (files == null) throw new IllegalStateException(\"parent /data/out not listable\");","typeGuard":null,"tryCatchPattern":"try {\n  ftpsConnection.createDirectory(dir);\n} catch (KettleException e) {\n  logError(\"Failed to create remote dir \" + dir + \": \" + e.getCause(), e);\n  throw e;\n}","preventionTips":["Create parent directories explicitly before nested paths","Grant the FTPS user directory-create permissions","Keep the control connection alive (enable keepalive/passive mode)"],"tags":["ftps","file-transfer","kettle"],"backgroundTag":"mkdir-permission-denied","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}