blob: 1a5a6f1ccfab7bdf9bb70baf08f7e64f87291e31 [file] [log] [blame]
Guido van Rossumc6360141990-10-13 19:23:40 +00001# Module 'shutil' -- utility functions usable in a shell-like program
Guido van Rossum277206b1997-04-29 13:08:15 +00002# XXX The copy*() functions here don't copy the data fork on Mac
Guido van Rossumc6360141990-10-13 19:23:40 +00003
Guido van Rossumc96207a1992-03-31 18:55:40 +00004import os
Guido van Rossumc6360141990-10-13 19:23:40 +00005
6MODEBITS = 010000 # Lower 12 mode bits
7# Change this to 01000 (9 mode bits) to avoid copying setuid etc.
8
9# Copy data from src to dst
10#
11def copyfile(src, dst):
Guido van Rossum277206b1997-04-29 13:08:15 +000012 fsrc = None
13 fdst = None
14 try:
15 fsrc = open(src, 'rb')
16 fdst = open(dst, 'wb')
17 while 1:
18 buf = fsrc.read(16*1024)
19 if not buf:
20 break
21 fdst.write(buf)
22 finally:
23 if fdst:
24 fdst.close()
25 if fsrc:
26 fsrc.close()
Guido van Rossumc6360141990-10-13 19:23:40 +000027
28# Copy mode bits from src to dst
29#
30def copymode(src, dst):
Guido van Rossumc96207a1992-03-31 18:55:40 +000031 st = os.stat(src)
Guido van Rossumc6360141990-10-13 19:23:40 +000032 mode = divmod(st[0], MODEBITS)[1]
Guido van Rossumc96207a1992-03-31 18:55:40 +000033 os.chmod(dst, mode)
Guido van Rossumc6360141990-10-13 19:23:40 +000034
35# Copy all stat info (mode bits, atime and mtime) from src to dst
36#
37def copystat(src, dst):
Guido van Rossumc96207a1992-03-31 18:55:40 +000038 st = os.stat(src)
Guido van Rossumc6360141990-10-13 19:23:40 +000039 mode = divmod(st[0], MODEBITS)[1]
Guido van Rossumc96207a1992-03-31 18:55:40 +000040 os.chmod(dst, mode)
41 os.utime(dst, st[7:9])
Guido van Rossumc6360141990-10-13 19:23:40 +000042
43# Copy data and mode bits ("cp src dst")
44#
45def copy(src, dst):
46 copyfile(src, dst)
47 copymode(src, dst)
48
49# Copy data and all stat info ("cp -p src dst")
50#
51def copy2(src, dst):
52 copyfile(src, dst)
53 copystat(src, dst)
54
55# Recursively copy a directory tree.
56# The destination must not already exist.
57#
58def copytree(src, dst):
Guido van Rossumc96207a1992-03-31 18:55:40 +000059 names = os.listdir(src)
60 os.mkdir(dst, 0777)
61 dot_dotdot = (os.curdir, os.pardir)
Guido van Rossumc6360141990-10-13 19:23:40 +000062 for name in names:
63 if name not in dot_dotdot:
Guido van Rossumc96207a1992-03-31 18:55:40 +000064 srcname = os.path.join(src, name)
65 dstname = os.path.join(dst, name)
Guido van Rossumc6360141990-10-13 19:23:40 +000066 #print 'Copying', srcname, 'to', dstname
67 try:
Guido van Rossumc96207a1992-03-31 18:55:40 +000068 #if os.path.islink(srcname):
69 # linkto = os.readlink(srcname)
70 # os.symlink(linkto, dstname)
71 #elif os.path.isdir(srcname):
72 if os.path.isdir(srcname):
Guido van Rossumc6360141990-10-13 19:23:40 +000073 copytree(srcname, dstname)
74 else:
75 copy2(srcname, dstname)
76 # XXX What about devices, sockets etc.?
Guido van Rossumc96207a1992-03-31 18:55:40 +000077 except os.error, why:
Guido van Rossumc6360141990-10-13 19:23:40 +000078 print 'Could not copy', srcname, 'to', dstname,
79 print '(', why[1], ')'