{"record":{"id":"fe93e70ec9ab86ad","repo":"pentaho/pentaho-kettle","slug":"getsubfolders-exception-noaccessiblefiles","errorCode":"GetSubFolders.Exception.NoAccessibleFiles","errorMessage":"GetSubFolders.Exception.NoAccessibleFiles","messagePattern":"GetSubFolders\\.Exception\\.NoAccessibleFiles","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/getsubfolders/GetSubFolders.java","lineNumber":236,"sourceCode":"    }\n\n    return true;\n  }\n\n  private void handleMissingFiles() throws KettleException {\n    List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();\n\n    if ( nonExistantFiles.size() != 0 ) {\n      String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );\n      logError( BaseMessages.getString( PKG, \"GetSubFolders.Error.MissingFiles\", message ) );\n      throw new KettleException( BaseMessages.getString( PKG, \"GetSubFolders.Exception.MissingFiles\", message ) );\n    }\n\n    List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();\n    if ( nonAccessibleFiles.size() != 0 ) {\n      String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );\n      logError( BaseMessages.getString( PKG, \"GetSubFolders.Error.NoAccessibleFiles\", message ) );\n      throw new KettleException( BaseMessages\n        .getString( PKG, \"GetSubFolders.Exception.NoAccessibleFiles\", message ) );\n    }\n  }\n\n  public boolean init( StepMetaInterface smi, StepDataInterface sdi ) {\n    meta = (GetSubFoldersMeta) smi;\n    data = (GetSubFoldersData) sdi;\n\n    if ( super.init( smi, sdi ) ) {\n      //Set Embedded NamedCluter MetatStore Provider Key so that it can be passed to VFS\n      if ( getTransMeta().getNamedClusterEmbedManager() != null ) {\n        getTransMeta().getNamedClusterEmbedManager()\n          .passEmbeddedMetastoreKey( this, getTransMeta().getEmbeddedMetastoreProviderKey() );\n      }\n      try {\n        data.filessize = 0;\n        data.rownr = 1L;\n        data.filenr = 0;","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/getsubfolders/GetSubFolders.java#L218-L254","documentation":"GetSubFolders.handleMissingFiles throws KettleException 'NoAccessibleFiles' when configured folder paths exist but cannot be accessed (permission or I/O failure). FileInputList collects non-accessible FileObjects, lists them in the message, and the step aborts rather than partially reading folders it can't open.","triggerScenarios":"handleMissingFiles (from processRow) finds data.files.getNonAccessibleFiles() non-empty: paths exist but the PDI process user lacks read/execute permission, or the mount is unavailable.","commonSituations":"Running PDI as a service account without permissions on shared/network folders; NFS/SMB mount down; Windows share credentials not configured; files owned by another user with restrictive modes.","solutions":["Grant the user running PDI read (and execute/traverse) permission on the listed folders.","Verify network mounts/shares are up and credentials are valid.","Test access manually as the PDI service user (ls / dir on each path).","Fix ownership or ACLs on the folders, or run the transformation under an account with access."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Check read/traverse permission on folders before the run\nfor ( String folder : meta.getFolderName() ) {\n  File f = new File( transMeta.environmentSubstitute( folder ) );\n  if ( f.exists() && !f.canRead() )\n    throw new IllegalStateException( \"No read permission on folder: \" + f );\n}","typeGuard":null,"tryCatchPattern":"try {\n  trans.execute( null );\n} catch ( KettleException e ) {\n  if ( e.getMessage() != null && e.getMessage().contains( \"NoAccessibleFiles\" ) ) {\n    // surface the inaccessible paths to ops for permission/mount fixes\n  } else throw e;\n}","preventionTips":["Run PDI under an account with access to all referenced shares","Verify NFS/SMB mounts before scheduled runs","Document required ACLs per environment","Test with the same service user that executes the scheduler"],"tags":["kettle","pdi","filesystem","permissions"],"backgroundTag":"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"}