最新在修改 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()
raisedef 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)