{"record":{"id":"51948bfd853f1ac0","repo":"pentaho/pentaho-kettle","slug":"zipfile-error-targetfileempty","errorCode":null,"errorMessage":"ZipFile.Error.TargetFileEmpty","messagePattern":"ZipFile\\.Error\\.TargetFileEmpty","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/zipfile/ZipFile.java","lineNumber":188,"sourceCode":"        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 {\n          // let's check parent folder\n          FileObject parentFolder = data.zipFile.getParent();\n          if ( !parentFolder.exists() ) {\n            if ( !meta.isCreateParentFolder() ) {\n              // Parent folder not exist\n              // So we will fail\n              throw new KettleException( BaseMessages.getString(\n                PKG, \"ZipFile.Error.TargetParentFolderNotExists\", parentFolder.toString() ) );\n            } else {\n              // Create parent folder","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/zipfile/ZipFile.java#L170-L206","documentation":"The dynamic zip target filename read from the current row is null or empty. The step logs 'ZipFile.Error.TargetFileEmpty' and throws a KettleException because there is no name for the zip archive to create.","triggerScenarios":"getInputRowMeta().getString(r, data.indexOfZipFilename) returns null/empty at ZipFile.java:188 for a row (after the first-row field-index checks passed).","commonSituations":"A generator or lookup step emitted rows where the target filename is NULL; date/variable substitution produced an empty string; wrong field selected as the dynamic target filename field.","solutions":["Fix the upstream step to always supply a non-empty target filename.","Filter out rows with empty target filenames before ZipFile.","Substitute a computed default target filename when the value is empty.","Confirm the correct field is configured as the dynamic target filename field."],"exampleFix":"// before: rows with NULL zipTarget reach ZipFile\n// after: Filter rows step\n// condition: zipTarget IS NOT NULL AND LENGTH(zipTarget) > 0","handlingStrategy":"validation","validationCode":"// Upstream filter before ZipFile:\n// condition: zipTarget IS NOT NULL AND LENGTH(TRIM(zipTarget)) > 0","typeGuard":null,"tryCatchPattern":"try {\n  transformation.execute();\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"TargetFileEmpty\")) {\n    log.warn(\"Row skipped: empty zip target filename\", e);\n  } else { throw e; }\n}","preventionTips":["Guarantee target filename generation covers every row (no NULLs from lookups).","Check variable/date substitution used to build target names.","Preview the target filename field at the step input."],"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"}