| # Module 'shutil' -- utility functions usable in a shell-like program |
| |
| import posix |
| import path |
| |
| MODEBITS = 010000 # Lower 12 mode bits |
| # Change this to 01000 (9 mode bits) to avoid copying setuid etc. |
| |
| # Copy data from src to dst |
| # |
| def copyfile(src, dst): |
| fsrc = open(src, 'r') |
| fdst = open(dst, 'w') |
| while 1: |
| buf = fsrc.read(16*1024) |
| if not buf: break |
| fdst.write(buf) |
| |
| # Copy mode bits from src to dst |
| # |
| def copymode(src, dst): |
| st = posix.stat(src) |
| mode = divmod(st[0], MODEBITS)[1] |
| posix.chmod(dst, mode) |
| |
| # Copy all stat info (mode bits, atime and mtime) from src to dst |
| # |
| def copystat(src, dst): |
| st = posix.stat(src) |
| mode = divmod(st[0], MODEBITS)[1] |
| posix.chmod(dst, mode) |
| posix.utimes(dst, st[7:9]) |
| |
| # Copy data and mode bits ("cp src dst") |
| # |
| def copy(src, dst): |
| copyfile(src, dst) |
| copymode(src, dst) |
| |
| # Copy data and all stat info ("cp -p src dst") |
| # |
| def copy2(src, dst): |
| copyfile(src, dst) |
| copystat(src, dst) |
| |
| # Recursively copy a directory tree. |
| # The destination must not already exist. |
| # |
| def copytree(src, dst): |
| names = posix.listdir(src) |
| posix.mkdir(dst, 0777) |
| dot_dotdot = '.', '..' |
| for name in names: |
| if name not in dot_dotdot: |
| srcname = path.join(src, name) |
| dstname = path.join(dst, name) |
| #print 'Copying', srcname, 'to', dstname |
| try: |
| #if path.islink(srcname): |
| # linkto = posix.readlink(srcname) |
| # posix.symlink(linkto, dstname) |
| #elif path.isdir(srcname): |
| if path.isdir(srcname): |
| copytree(srcname, dstname) |
| else: |
| copy2(srcname, dstname) |
| # XXX What about devices, sockets etc.? |
| except posix.error, why: |
| print 'Could not copy', srcname, 'to', dstname, |
| print '(', why[1], ')' |