{"record":{"id":"3a5d7b32c55da9c9","repo":"pentaho/pentaho-kettle","slug":"vfs-provider-create-folder-not-supported-error","errorCode":"vfs.provider/create-folder-not-supported.error","errorMessage":"vfs.provider/create-folder-not-supported.error","messagePattern":"vfs\\.provider/create-folder-not-supported\\.error","errorType":"error_code","errorClass":"FileSystemException","httpStatus":null,"severity":"error","filePath":"plugins/s3-vfs/core/src/main/java/org/pentaho/s3common/S3CommonFileObject.java","lineNumber":513,"sourceCode":"      // create meta-data for your folder and set content-length to 0\n      ObjectMetadata metadata = new ObjectMetadata();\n      metadata.setContentLength( 0 );\n      metadata.setContentType( \"binary/octet-stream\" );\n\n      // create empty content\n      InputStream emptyContent = new ByteArrayInputStream( new byte[ 0 ] );\n\n      // create a PutObjectRequest passing the folder name suffixed by /\n      PutObjectRequest putObjectRequest = createPutObjectRequest( bucketName, key + DELIMITER, emptyContent, metadata );\n\n      // send request to S3 to create folder\n      try {\n        fileSystem.getS3Client().putObject( putObjectRequest );\n      } catch ( AmazonS3Exception e ) {\n        throw new FileSystemException( \"vfs.provider.local/create-folder.error\", this, e );\n      }\n    } else {\n      throw new FileSystemException( \"vfs.provider/create-folder-not-supported.error\" );\n    }\n  }\n\n\n  protected PutObjectRequest createPutObjectRequest( String bucketName, String key, InputStream inputStream,\n                                                     ObjectMetadata objectMetadata ) {\n    return new PutObjectRequest( bucketName, key, inputStream, objectMetadata );\n  }\n\n  @Override\n  protected void doRename( FileObject newFile ) throws Exception {\n    // no folder renames on S3\n    if ( getType().equals( FileType.FOLDER ) ) {\n      logger.debug( \"recursively moving folder [{}] -> [{}]\", this.getPublicURIString(), newFile.getPublicURIString() );\n      doFolderMove( this, newFile );\n      return;\n    }\n","sourceCodeStart":495,"sourceCodeEnd":531,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/s3-vfs/core/src/main/java/org/pentaho/s3common/S3CommonFileObject.java#L495-L531","documentation":"Thrown by S3CommonFileObject.doCreateFolder() when the file object is not a folder-capable type (the 'isFolderCreatable' style condition fails), so no S3 folder marker can be written. It indicates the requested folder-creation operation is not supported for this object.","triggerScenarios":"Calling createFolder() on an S3 VFS object whose type/scheme does not permit creating the zero-byte '/'-suffixed marker object (e.g. creating nested folders under a non-existent parent path, or a non-s3 file object).","commonSituations":"Trying to create deeply nested folders where parent prefixes don't exist; calling folder creation on a file-type S3 object; using the VFS manager on a scheme where folder creation isn't implemented.","solutions":["Create parent prefixes first, one level at a time, before creating the deepest folder","Check the condition guarding doCreateFolder to see why the object was deemed non-folder-creatable","Write files under the desired prefix instead — S3 implicitly treats prefixes as folders","Avoid using a generic VFS createFolder on S3 objects that represent existing files"],"exampleFix":"// before\nFileObject folder = fsManager.resolveFile( \"s3://bucket/a/b/c/\" );\nfolder.createFolder();\n// after\nFileObject parent = fsManager.resolveFile( \"s3://bucket/a/\" );\nparent.createFolder();\nfsManager.resolveFile( \"s3://bucket/a/b/\" ).createFolder();\nfsManager.resolveFile( \"s3://bucket/a/b/c/\" ).createFolder();","handlingStrategy":"validation","validationCode":"// create parent levels first, then leaf\nFileObject parent = fsManager.resolveFile( \"s3://bucket/some/existing/\" );\nif ( !parent.exists() ) {\n  throw new IllegalStateException( \"parent prefix must exist: \" + parent.getName().getURI() );\n}","typeGuard":null,"tryCatchPattern":"try {\n  folder.createFolder();\n} catch ( FileSystemException e ) {\n  if ( \"vfs.provider/create-folder-not-supported.error\".equals( e.getMessage() ) ) {\n    // fall back to writing a marker object or creating parents individually\n  }\n  throw e;\n}","preventionTips":["Create parent prefixes level by level before creating nested folders","Never call createFolder() on an object that resolves to an existing file key","Check the VFS scheme supports folder semantics before using generic createFolder","Rely on implicit S3 prefix semantics when deep nesting is needed"],"tags":["s3","vfs","unsupported-operation","folder-creation"],"backgroundTag":"unsupported-operation","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"}