2015-05-25 10 views
6

wiem, że jeśli chcę, aby skopiować plik w Pythonie, ale nie zastąpi cel mogę użyć kodu jak poniżej:Skopiuj plik, ale nie zastępować, bez problemów TOCTTOU w Pythonie

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

Ale stan świata może się zmienić między czasem, który nazywam os.path.exists, a czasem, który nazywam copy2. Czy istnieje bardziej preferowany sposób kopiowania bez nadpisywania, prawdopodobnie w przypadku, gdy operacja kopiowania spowoduje zgłoszenie wyjątku, jeśli cel już istnieje?

Odpowiedz

7

Można użyć niższego poziomu os.open a następnie os.fdopen skopiować plik:

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)' może? – Zizouz212

+1

Użycie 'shutil.copyfileobj (sf, f)' byłoby lepsze niż 'f.write (sf.read())', ponieważ nie odczytałoby całego pliku do pamięci –

+0

Dziękuję wam obojgu! Wprowadziłem te zmiany. – Misandrist

Powiązane problemy