pentaho/pentaho-kettle · error · KettleException

AccessOutputMeta.Exception.FileDoesNotExist

AccessOutputMeta.Exception.FileDoesNotExist

Error message

AccessOutputMeta.Exception.FileDoesNotExist

What it means

AccessOutputDialog.getTableName resolves the configured filename through VFS, converts it to a local File, and requires it to be an existing regular file before opening the Access DB read-only to list table names. If the file is missing, KettleException with AccessOutputMeta.Exception.FileDoesNotExist is thrown.

Solutions

  1. Set a valid existing .mdb/.accdb path in the Filename field
  2. Define the variables used in the filename before browsing
  3. Ensure the VFS URL resolves to a local file path
  4. Mount/verify the network share hosting the file
  5. Restore or recreate the Access database file

Example fix

null
Defensive patterns

Strategy: validation

Validate before calling

String real = transMeta.environmentSubstitute(meta.getFilename());
FileObject fo = KettleVFS.getInstance(transMeta.getBowl()).getFileObject(real, transMeta);
File f = FileUtils.toFile(fo.getURL());
if (f == null || !f.exists() || !f.isFile()) {
  throw new IllegalArgumentException("Access DB not a local file: " + real);
}

Prevention

When it happens

Trigger: Clicking the 'Browse table' button in the Access Output dialog when the substituted filename doesn't exist, is a directory, or the VFS URL cannot map to a real local file.

Common situations: Variable-based filename not defined at design time; file on an unmounted share; using a VFS URL scheme that does not resolve to a local path; file deleted since configuration.

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/f3892a05fa972400. Report an issue: GitHub.

Appendix: source

Thrown at plugins/ms-access/ui/src/main/java/org/pentaho/di/ui/trans/steps/accessoutput/AccessOutputDialog.java:468

    stepname = wStepname.getText(); // return value

    getInfo( input );

    dispose();
  }

  private void getTableName() {
    AccessOutputMeta meta = new AccessOutputMeta();
    getInfo( meta );
    // New class: SelectTableDialog
    try {
      String realFilename = transMeta.environmentSubstitute( meta.getFilename() );
      FileObject fileObject = KettleVFS.getInstance( transMeta.getBowl() ).getFileObject( realFilename, transMeta );
      File file = FileUtils.toFile( fileObject.getURL() );

      if ( !file.exists() || !file.isFile() ) {
        throw new KettleException( BaseMessages.getString(
          PKG, "AccessOutputMeta.Exception.FileDoesNotExist", realFilename ) );
      }

      try ( Database database = new DatabaseBuilder( file ).setReadOnly( true ).open() ) {
        Set<String> set = database.getTableNames();
        String[] tablenames = set.toArray( new String[set.size()] );
        EnterSelectionDialog dialog =
          new EnterSelectionDialog( shell, tablenames,
            BaseMessages.getString( PKG, "AccessOutputDialog.Dialog.SelectATable.Title" ),
            BaseMessages.getString( PKG, "AccessOutputDialog.Dialog.SelectATable.Message" ) );
        String tablename = dialog.open();
        if ( tablename != null ) {
          wTablename.setText( tablename );
        }
      }
    } catch ( Throwable e ) {
      new ErrorDialog(
        shell, BaseMessages.getString( PKG, "AccessOutputDialog.UnableToGetListOfTables.Title" ), BaseMessages

View on GitHub (pinned to f3058517a1)