2015-05-25 11 views
6

So che se voglio copiare un file in Python, ma non sovrascrive la destinazione è possibile utilizzare il codice come questo:Copiare un file, ma non sovrascrivere senza problemi TOCTTOU in Python

if os.path.exists(dest): 
    raise Exception("Destination file exists!") 
else: 
    shutil.copy2(src, dest) 

Ma lo stato del mondo potrebbe cambiare tra il tempo che io chiamo os.path.exists e l'ora che chiamo copy2. Esiste un modo più preferito di copiare senza sovrascrivere, presumibilmente in cui l'operazione di copia genererà un'eccezione se la destinazione esiste già?

risposta

7

È possibile utilizzare il livello inferiore os.open e poi os.fdopen per copiare il file:

import os 
import shutil 

# Open the file and raise an exception if it exists 
fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY) 

# Copy the file and automatically close files at the end 
with os.fdopen(fd) as f: 
    with open(src_filename) as sf: 
     shutil.copyfileobj(sf, f) 
+1

'os.fdopen (fd)', forse? – Zizouz212

+1

Usare 'shutil.copyfileobj (sf, f)' sarebbe preferibile a 'f.write (sf.read())' dato che non leggerebbe l'intero file nella memoria –

+0

Grazie a entrambi! Ho fatto quei cambiamenti. – Misandrist

Problemi correlati