9

I have files that need an extra attribute called "encryption used". But this gives "IllegalArgumentExeption". I know why it gives that error, "encryption used" isn't known as an attribute, but is there a way I can force it to be? Or add custom metadata to the file?

 Path path = new File("/propertyfiles/encdec.properties").toPath();

    try{
        Files.setAttribute(path, "encryption used", "testtesttest");
    }catch(IOException e){
        System.out.println(e.getMessage());
    }
    try{
        System.out.println(Files.getAttribute(path, "encryption used"));
    }catch(IOException e){
        System.out.println(e.getMessage());
    }
user1008531
  • 491
  • 2
  • 8
  • 17

1 Answers1

12

If your file system supports user-defined (aka extended) attributes, then the way to set one would be like this:

Files.setAttribute(path, "user:encryption used", "testtesttest");

As the javadoc for setAttribute explains, the 2nd argument takes the form of an optional view-name and an attribute name. In this case, you need to use the UserDefinedFileAttributeView whose view-name is "user".

Note that different file system types support different attribute views, and your file system may not support this one. This particularly applies across different operating systems; e.g. you can't read a file's MacOS file attributes on a Linux system via these APIs.

Stephen C
  • 698,415
  • 94
  • 811
  • 1,216
  • Also, it's worth mentioning that extended attributes are platform dependent, so an attribute on a file created, let's say, on MacOS, cannot be read on Linux (at least not naturally) – Thales Valias Mar 30 '23 at 11:48