Esiste solo un algoritmo di sostituzione:

codice:
tmp = a
a = b
b = tmp
Credo che la scelta di utilizzare una cartella temporanea sia la più giusta.

Per ottimizzare potresti esegure il lavoro in parallello, del tipo, nel corpo del tuo ciclo esegure:

codice:
sposta file a in tmp
try {
   sovrascrivi file a con file b
} catch() {
   errore!!!
}
In questo modo non copi prima tutti i file in temp e nel caso di errore devi ripristinare solo quello che hai già trasferito.

Come la vedi?