pentaho/pentaho-kettle · error · KettleException

AccessOutputMeta.Exception.FileDoesNotExist

AccessOutputMeta.Exception.FileDoesNotExist

Error message

AccessOutputMeta.Exception.FileDoesNotExist

What it means

AccessOutputMeta.getRequiredFields resolves the configured filename with environment substitution and requires it to be an existing regular file, because it must open the Access database read-only to read table metadata. If the file does not exist or is not a file, it throws KettleException with AccessOutputMeta.Exception.FileDoesNotExist.

Solutions

  1. Verify the configured filename points to an existing .mdb/.accdb file
  2. Check that environment variables used in the path are defined at runtime
  3. Confirm the file is mounted/accessible from the machine running the transformation
  4. Fix the path to a directory vs file mixup
  5. Create or restore the Access database file

Example fix

// before
meta.setFilename("${OUTPUT_DIR}/data.mdb");
// after
// ensure the variable resolves to an existing file
File f = new File(space.environmentSubstitute("${OUTPUT_DIR}/data.mdb"));
if (!f.exists() || !f.isFile()) throw new IllegalStateException("Access DB missing: " + f);
meta.setFilename("${OUTPUT_DIR}/data.mdb");
Defensive patterns

Strategy: validation

Validate before calling

String real = space.environmentSubstitute(meta.getFilename());
File f = new File(real);
if (!f.exists() || !f.isFile()) {
  throw new IllegalArgumentException("Access DB file not found: " + real);
}

Prevention

When it happens

Trigger: Calling getRequiredFields (via the fields/metadata lookup) when the substituted filename points to a nonexistent path, a directory, or the file was deleted/moved after configuration.

Common situations: Typo in the .mdb/.accdb path; file moved between environments; environment variable not set so substitution yields a wrong path; running on a server where the file share is not mounted.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/ed65c0dc57202bb0. Report an issue: GitHub.

Appendix: source

Thrown at plugins/ms-access/impl/src/main/java/org/pentaho/di/trans/steps/accessoutput/AccessOutputMeta.java:250

      remarks.add( cr );
    }
  }

  public StepInterface getStep( StepMeta stepMeta, StepDataInterface stepDataInterface, int cnr,
    TransMeta transMeta, Trans trans ) {
    return new AccessOutput( stepMeta, stepDataInterface, cnr, transMeta, trans );
  }

  public StepDataInterface getStepData() {
    return new AccessOutputData();
  }

  public RowMetaInterface getRequiredFields( VariableSpace space ) throws KettleException {
    String realFilename = space.environmentSubstitute( filename );
    File file = new File( realFilename );
    try {
      if ( !file.exists() || !file.isFile() ) {
        throw new KettleException( BaseMessages.getString(
          PKG, "AccessOutputMeta.Exception.FileDoesNotExist", realFilename ) );
      }

      // Open the database in read-only mode and get the table metadata.
      try ( Database db = new DatabaseBuilder( file ).setReadOnly( true ).open() ) {
        String realTablename = space.environmentSubstitute( tablename );
        Table table = db.getTable( realTablename );
        if ( table == null ) {
          throw new KettleException( BaseMessages.getString(
            PKG, "AccessOutputMeta.Exception.TableDoesNotExist", realTablename ) );
        }

        return getLayout( table );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString( PKG, "AccessOutputMeta.Exception.ErrorGettingFields" ), e );
    }
  }

View on GitHub (pinned to f3058517a1)