{"record":{"id":"5b6d34b168a7df18","repo":"pentaho/pentaho-kettle","slug":"zipfile-error-emptymovetofolder","errorCode":null,"errorMessage":"ZipFile.Error.EmptyMoveToFolder","messagePattern":"ZipFile\\.Error\\.EmptyMoveToFolder","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/zipfile/ZipFile.java","lineNumber":178,"sourceCode":"        if ( data.sourceFile.getType() != FileType.FILE ) {\n          log.logError( toString(), BaseMessages\n            .getString( PKG, \"ZipFile.Error.SourceFileNotFile\", sourceFilename ) );\n          throw new KettleException( BaseMessages.getString(\n            PKG, \"ZipFile.Error.SourceFileNotFile\", sourceFilename ) );\n        }\n      }\n\n      // get basefolder\n      if ( data.indexOfBaseFolder > -1 ) {\n        data.baseFolder = getInputRowMeta().getString( r, data.indexOfBaseFolder );\n      }\n\n      // get destination folder\n      String moveToFolder = null;\n      if ( data.indexOfMoveToFolder > -1 ) {\n        moveToFolder = getInputRowMeta().getString( r, data.indexOfMoveToFolder );\n        if ( Utils.isEmpty( moveToFolder ) ) {\n          throw new KettleException( BaseMessages.getString( PKG, \"ZipFile.Error.EmptyMoveToFolder\" ) );\n        }\n      }\n\n      if ( !skip ) {\n        // get value for target filename\n        String targetFilename = getInputRowMeta().getString( r, data.indexOfZipFilename );\n\n        if ( Utils.isEmpty( targetFilename ) ) {\n          log.logError( toString(), BaseMessages.getString( PKG, \"ZipFile.Error.TargetFileEmpty\" ) );\n          throw new KettleException( BaseMessages.getString( PKG, \"ZipFile.Error.TargetFileEmpty\" ) );\n        }\n        data.zipFile = KettleVFS.getInstance( getTransMeta().getBowl() ).getFileObject( targetFilename, this );\n        if ( data.zipFile.exists() ) {\n          if ( log.isDetailed() ) {\n            log.logDetailed( toString(), BaseMessages.getString(\n              PKG, \"ZipFile.Log.TargetFileExists\", targetFilename ) );\n          }\n        } else {","sourceCodeStart":160,"sourceCodeEnd":196,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/zipfile/ZipFile.java#L160-L196","documentation":"With operation MOVE, the move-to-folder field is present in the row but its value for the current row is null or empty. The step throws this KettleException because it cannot decide where to move the zipped file for that row.","triggerScenarios":"data.indexOfMoveToFolder > -1 and getInputRowMeta().getString(r, data.indexOfMoveToFolder) returns null/empty at ZipFile.java:178 during per-row processing (not first-row init).","commonSituations":"Upstream lookup or calculation produced NULL for some rows only; a text input row with a missing column; a join left the destination folder blank for unmatched rows.","solutions":["Fix the upstream step so every row carries a valid destination folder value.","Add a Filter rows step routing rows with an empty move-to-folder value elsewhere.","Use an NVL/default-value step to substitute a fallback folder.","Verify the correct field is selected as the move-to-folder field."],"exampleFix":"// before: moveFolder may be null\n// after: default it upstream\nNVL(moveToFolder, \"/data/archive\") // via 'Value Mapper' or calculator/default step","handlingStrategy":"validation","validationCode":"// Upstream filter/default for the move-to-folder column:\n// condition: moveToFolder IS NOT NULL AND TRIM(moveToFolder) <> \"\"\n// or default: NVL(moveToFolder, \"/data/archive\")","typeGuard":null,"tryCatchPattern":"try {\n  transformation.execute();\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"EmptyMoveToFolder\")) {\n    log.warn(\"Row skipped: empty move-to-folder value\", e);\n  } else { throw e; }\n}","preventionTips":["Default or filter destination folder values before ZipFile when using MOVE.","Validate lookup/join results that produce the folder value.","Preview rows to spot NULLs on a subset of data."],"tags":["pdi","kettle","null-value","empty-string","zip"],"backgroundTag":"empty-required-field","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"}