Way back in the day, I used to make C++ programs.
Either you are over-analysing it, or I am under-analyzing it.
Precision or constant logging is not important to implement this feature.
Regardless of when the PC powers off, what I requested to be uploaded does not change.
Regardless of when the PC powers off, your program does a perfect job of logging exactly what was uploaded successfully.
Flawless
There is no need for a new log.
You just store the file names of what the user requested to upload, and append only if the user adds new files.
So this action gets invoked only when the add files function is invoked.
Since your program does a perfect job of logging successful uploads, you need to store the file names(only when the program is started) of whatever was uploaded successfully. You program already has a function for this.
Finally, the new component, where you compare the two containers [Add files (filenames thereof), Uploaded Successfully (filenames thereof)], where the difference is stored, the result are the files which are not uploaded successfully, now add these to the queue with a nice message saying "The following files during previous upload failed to upload."
I make it sound so easy don't I