Ah, it seems like G_FILE_CREATE_REPLACE_DESTINATION is a little misleading...

g_file_create returns a GOutputStream and always fails if the file exists.

    If a file or directory with this name already exists the G_IO_ERROR_EXISTS error will be returned

It seems that this flag does not do anything and the correct approach is to use g_file_replace.

However, I am also ignoring the return value here too, which is very bad :-). I'll rework these functions a little to use the API correctly.