How to use a variable format in `sprintf`
sprintf cannot be used to write data into String objects. More precisely, it is possible to come up with a "hackish" way to write the result directly into a String object, but the latter is definitely not designed for such use.

The target buffer should be an array of char, not a String. Which is what the compiler is telling you.

char buffer[64];
sprintf(buffer, "%%0%d", i);


or better

char buffer[64];
snprintf(buffer, sizeof buffer, "%%0%d", i);

The format string you used in your sprintf will generate %02 result (since i contains 2 at that moment). Why you are expecting 09 is not clear. Why are you expecting the % character to disappear is not clear either, considering that the format string seems to be deliberately designed to include it.
A String object cannot be used as the first parameter of fprintf. It is not clear what that fprintf is doing in your code.




Apparently you are trying to use sprintf to generate another format string at run time (using i as field width), which is later used to output the d variable. In that case that would be something like

char format[16];
snprintf(format, sizeof format, "%%0%dd", i);
fprintf(file, format, d);


That fprintf will indeed output 09.