改进shutil中的copytree()和move()函数

http://blog.donews.com/limodou/archive/2006/08/08/992239.aspx
改进shutil中的copytree()和move()函数

最新在修改 NewEdit 中,在目录浏览窗口中增加了对文件和目录进行剪切、拷贝和粘贴的功能。因为要用到对整个目录的操作,因此我使用了shutil模块中的copytree()和move()函数。但是在使用过程中发现它们不能满足我的要求。

1. 在执行中,如果目标目录中已经有同名的目录存在,那么会报告说目录已经存在,并且会停止执行。我希望是当存在同名目录,一样可以继续向下处理。

2. 使用copytree()时,它只会把源目录下的所有内容拷贝过去,而源目录的basename不会在目标目录中先创建一个子目录。比如,源目录为/a/b,目标目录为/c,我希望在执行拷贝时先在/c下创建一个b目录。这个b就是源目录的basename。为什么要这样,因为 NewEdit 中显示的是一个树型结构,每个结点显示的都是不带路径的名字,也就是我这里说的basename。因此在拷贝或移动一个结点是,我希望是整个结点都过去,而不是只有这个结点下面的东西。因此为了实现我要求的功能,我把 shutil 中的 copytree() 和 move() 的代码拷贝下来进行了修改。

def my_copytree(src, dst):
    """Recursively copy a directory tree using copy2().

    Modified from shutil.copytree

    """
    base = os.path.basename(src)
    dst = os.path.join(dst, base)
    names = os.listdir(src)
    if not os.path.exists(dst):
        os.mkdir(dst)
    for name in names:
        srcname = os.path.join(src, name)
        try:
            if os.path.isdir(srcname):
                my_copytree(srcname, dst)
            else:
                shutil.copy2(srcname, dst)
        except:
            error.traceback()
            raise

def my_move(src, dst):
    """Recursively move a file or directory to another location.

    If the destination is on our current filesystem, then simply use
    rename.  Otherwise, copy src to the dst and then remove src.
    A lot more could be done here…  A look at a mv.c shows a lot of
    the issues this implementation glosses over.

    """

    try:
        os.rename(src, dst)
    except OSError:
        if os.path.isdir(src):
            if os.path.abspath(dst).startswith(os.path.abspath(src)):
                raise Exception, "Cannot move a directory ‘%s’ into itself ‘%s’." % (src, dst)
            my_copytree(src, dst)
            shutil.rmtree(src)
        else:
            shutil.copy2(src,dst)
            os.unlink(src)

你可能感兴趣的:(Python,dst,exception,tree,file)