{"record":{"id":"f6861758b38fbdf2","repo":"pentaho/pentaho-kettle","slug":"jobsftpput-error-cannotfindremotefolder","errorCode":"JobSFTPPUT.Error.CanNotFindRemoteFolder","errorMessage":"JobSFTPPUT.Error.CanNotFindRemoteFolder","messagePattern":"JobSFTPPUT\\.Error\\.CanNotFindRemoteFolder","errorType":"error_code","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/put-file-sftp/impl/src/main/java/org/pentaho/di/job/entries/sftpput/JobEntrySFTPPUT.java","lineNumber":809,"sourceCode":"      String realProxyHost = environmentSubstitute( getProxyHost() );\n      if ( !Utils.isEmpty( realProxyHost ) ) {\n        // Set proxy\n        sftpclient.setProxy(\n          realProxyHost, environmentSubstitute( getProxyPort() ), environmentSubstitute( getProxyUsername() ),\n          environmentSubstitute( getProxyPassword() ), getProxyType() );\n      }\n\n      // login to ftp host ...\n      sftpclient.login( realPassword );\n      // Don't show the password in the logs, it's not good for security audits\n      // logDetailed(\"logged in using password \"+realPassword); // Logging this seems a bad idea! Oh well.\n\n      // move to spool dir ...\n      if ( !Utils.isEmpty( realSftpDirString ) ) {\n        boolean existfolder = sftpclient.folderExists( realSftpDirString );\n        if ( !existfolder ) {\n          if ( !isCreateRemoteFolder() ) {\n            throw new KettleException( BaseMessages.getString(\n              PKG, \"JobSFTPPUT.Error.CanNotFindRemoteFolder\", realSftpDirString ) );\n          }\n          if ( log.isDetailed() ) {\n            logDetailed( BaseMessages\n              .getString( PKG, \"JobSFTPPUT.Error.CanNotFindRemoteFolder\", realSftpDirString ) );\n          }\n\n          // Let's create folder\n          sftpclient.createFolder( realSftpDirString );\n          if ( log.isDetailed() ) {\n            logDetailed( BaseMessages.getString( PKG, \"JobSFTPPUT.Log.RemoteFolderCreated\", realSftpDirString ) );\n          }\n        }\n        sftpclient.chdir( realSftpDirString );\n        if ( log.isDetailed() ) {\n          logDetailed( BaseMessages.getString( PKG, \"JobSFTPPUT.Log.ChangedDirectory\", realSftpDirString ) );\n        }\n      } // end if","sourceCodeStart":791,"sourceCodeEnd":827,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/put-file-sftp/impl/src/main/java/org/pentaho/di/job/entries/sftpput/JobEntrySFTPPUT.java#L791-L827","documentation":"During execution of the SFTP PUT job entry, the target remote directory (realSftpDirString) does not exist on the SFTP server and createRemoteFolder is disabled, so the entry aborts with this localized error instead of creating the folder. It is a pre-flight validation of the remote destination.","triggerScenarios":"sftpclient.folderExists(realSftpDirString) returns false while isCreateRemoteFolder() is false, immediately before moving to the remote spool directory to upload files.","commonSituations":"Typo in the remote folder path; folder removed on the server between runs; 'Create remote folder' checkbox left unchecked in the SFTP PUT dialog; wrong user home directory on the SFTP server.","solutions":["Enable 'Create remote folder' (createRemoteFolder) on the job entry","Correct the destination SFTP directory path in the job entry settings","Create the folder manually on the SFTP server or have an earlier job entry create it","Verify the SFTP user has permission to see/create the folder"],"exampleFix":"// before (entry config XML)\n<createRemoteFolder>N</createRemoteFolder>\n// after\n<createRemoteFolder>Y</createRemoteFolder>","handlingStrategy":"validation","validationCode":"// Java — before executing the entry\nSFTPClient client = new SFTPClient( ... );\nclient.connect( host, port, user, pass );\nboolean ok = client.folderExists( remoteDir );\nif ( !ok && !createRemoteFolder ) {\n  throw new IllegalStateException( \"Remote folder missing and createRemoteFolder is off: \" + remoteDir );\n}","typeGuard":null,"tryCatchPattern":"try {\n  jobEntry.execute( result, nr );\n} catch ( KettleException e ) {\n  if ( e.getMessage().contains( \"CanNotFindRemoteFolder\" ) ) {\n    logError( \"Create the remote folder or enable createRemoteFolder\" );\n  }\n  result.setResult( false );\n}","preventionTips":["Enable 'Create remote folder' for idempotent jobs","Validate remote paths with a dry-run connection at design time","Use variables/env checks to confirm the SFTP directory value resolves"],"tags":["sftp","remote-folder","job-entry"],"backgroundTag":"directory-not-found","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"}