2012-02-06 13 views
6

Próbuję skopiować folder do innego po to został usunięty:dir_util.copy_tree nie powiedzie się po shutil.rmtree

for i in range(0,3): 
    try: 
     dir_util.remove_tree("D:/test2") 
#  shutil.rmtree("D:/test2") 
     print "removed" 
    except: pass 

    dir_util.copy_tree("D:/test1", "D:/test2") 

    print i 

D:/test1 zawiera jeden pusty plik o nazwie plik_testowy. Jeśli używam dir_util.remove_tree działa dobrze, ale po shutil.rmtree działa tylko raz, w drugiej iteracji nie powiedzie się. Wyjście:

removed 
0 
removed 
Traceback (most recent call last): 
    File "test.py", line 53, in <module> 
    dir_util.copy_tree("D:/test1", "D:/test2") 
    File "C:\Python27\lib\distutils\dir_util.py", line 163, in copy_tree 
    dry_run=dry_run) 
    File "C:\Python27\lib\distutils\file_util.py", line 148, in copy_file 
    _copy_file_contents(src, dst) 
    File "C:\Python27\lib\distutils\file_util.py", line 44, in _copy_file_contents 
    fdst = open(dst, 'wb') 
IOError: [Errno 2] No such file or directory: 'D:/test2\\test_file' 

Wygodniej jest używać shutil.rmtree, ponieważ umożliwia obsługę błędów przy usuwaniu plików tylko do odczytu. Jaka jest różnica między dir_util.remove_tree i shutil.rmtree? Dlaczego copy_tree nie działa po raz drugi?

Używam Python 2.7.2 na Windows 7

+1

Działa pod Linuksem z pythonem 2.7.2. Wydaje się, że system plików nie jest zsynchronizowany/przepłukany między wywołaniami. –

+0

Też znajduję, że to działa z win7: py2.7.1 i py3.2.1. Czy piszesz na normalnym dysku? –

+0

@JohanLundberg, tak, to normalny hdd – tas

Odpowiedz

0

Wygląda to bardzo podobnie jak ty są coraz ugryziony przez odmianach separatory ścieżek. Główną wskazówką jest:

IOError: [Errno 2] No such file or directory: 'D:/test2\\test_file' 

Który łączy nazwę pliku z nazwą katalogu za pomocą os.sep. Myślę, że powinieneś użyć odpowiednich separatorów ścieżek, jeśli możesz.

10

Wydaje się być błędem w distutils. Jeśli skopiujesz folder, a następnie go usuniesz, a następnie ponownie go skopiujesz, to się nie powiedzie, ponieważ buforuje wszystkie utworzone katalogi. Aby obejść można wyczyścić _path_created przed kopię:

distutils.dir_util._path_created = {} 
distutils.dir_util.copy_tree(src, dst) 
+0

Wystąpił ten sam problem i to obejście "naprawia" to. Ale sprawia, że ​​kod wygląda trochę niejasno, więc spróbuję użyć innego mechanizmu kopiowania ... – glaed

+0

@DikobrAz, Dziękuję bardzo ~ – Jerome

+0

nie ma za co @Jerome :) – DikobrAz

1

Wygląda na to, że brak spójności w separatorze ścieżek. W systemie Windows powinieneś użyć "\\" (musi on zostać zmieniony). * Systemy Nix używają /.

Możesz użyć: os.path.join ("D: \\ test2", "plik_testowy"), aby uczynić go niezależnym od systemu operacyjnego. More info

Powiązane problemy