how to copy directory with all file from c:\\xxx\yyy to c:\\zzz\ in python

python, python-2.7

Solution

Look at `errno` for possible errors. You can use `.copytree()` first, and then when there is error, use `shutil.copy`.

From: http://docs.python.org/library/shutil.html#shutil.copytree

If exception(s) occur, an Error is raised with a list of reasons.

So then you can decide what to do with it and implement your code to handle it.

import shutil, errno

def copyFile(src, dst):
    try:
        shutil.copytree(src, dst)
    # Depend what you need here to catch the problem
    except OSError as exc: 
        # File already exist
        if exc.errno == errno.EEXIST:
            shutil.copy(src, dst)
        # The dirtory does not exist
        if exc.errno == errno.ENOENT:
            shutil.copy(src, dst)
        else:
            raise

About `.copy()`: http://docs.python.org/library/shutil.html#shutil.copy

Copy the file src to the file or directory dst. If dst is a directory, a file with the same basename as src is created (or overwritten) in the directory specified. Permission bits are copied. src and dst are path names given as strings.

Edit: Maybe also look into `distutils.dir_util.copy_tree`

Problem

I've been trying to use "copytree(src,dst)", however I couldn't since the destination folder should exists at all.Here you can see the small piece of code I wrote: ``` def copy_dir(src,dest): import shutil shutil.copytree(src,dest) copy_dir('C:/crap/chrome/','C:/test/') ``` and this is the error I m getting as I expected... ``` Traceback (most recent call last): File "C:\Documents and Settings\Administrator\workspace\MMS-Auto\copy.py", line 5, in <module> copy_dir('C:/crap/chrome/','C:/test/') File "C:\Documents and Settings\Administrator\workspace\MMS-Auto\copy.py", line 3, in copy_dir shutil.copytree(src,dest) File "C:\Python27\lib\shutil.py", line 174, in copytree os.makedirs(dst) File "C:\Python27\lib\os.py", line 157, in makedirs mkdir(name, mode) WindowsError: [Error 183] Cannot create a file when that file already exists: 'C:/test/' ``` Here is my question is there a way I could achieve the same result without creating my own copytree function? Thank you in advance.

Original source