blob: 60c5c6d711a28e86eee593f2ea23b98463991537 [file] [log] [blame]
Guido van Rossum9d0a3df1997-04-29 14:45:19 +00001"""Utility functions for copying files.
2
3XXX The functions here don't copy the data fork or other metadata on Mac.
4
5"""
Guido van Rossumc6360141990-10-13 19:23:40 +00006
Guido van Rossumc96207a1992-03-31 18:55:40 +00007import os
Guido van Rossum9d0a3df1997-04-29 14:45:19 +00008import stat
Guido van Rossumc6360141990-10-13 19:23:40 +00009
Guido van Rossumc6360141990-10-13 19:23:40 +000010
Guido van Rossumc6360141990-10-13 19:23:40 +000011def copyfile(src, dst):
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000012 """Copy data from src to dst"""
Guido van Rossuma2baf461997-04-29 14:06:46 +000013 fsrc = None
14 fdst = None
15 try:
16 fsrc = open(src, 'rb')
17 fdst = open(dst, 'wb')
18 while 1:
19 buf = fsrc.read(16*1024)
20 if not buf:
21 break
22 fdst.write(buf)
23 finally:
24 if fdst:
25 fdst.close()
26 if fsrc:
27 fsrc.close()
Guido van Rossumc6360141990-10-13 19:23:40 +000028
Guido van Rossumc6360141990-10-13 19:23:40 +000029def copymode(src, dst):
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000030 """Copy mode bits from src to dst"""
Guido van Rossuma2baf461997-04-29 14:06:46 +000031 st = os.stat(src)
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000032 mode = stat.S_IMODE(st[stat.ST_MODE])
Guido van Rossuma2baf461997-04-29 14:06:46 +000033 os.chmod(dst, mode)
Guido van Rossumc6360141990-10-13 19:23:40 +000034
Guido van Rossumc6360141990-10-13 19:23:40 +000035def copystat(src, dst):
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000036 """Copy all stat info (mode bits, atime and mtime) from src to dst"""
Guido van Rossuma2baf461997-04-29 14:06:46 +000037 st = os.stat(src)
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000038 mode = stat.S_IMODE(st[stat.ST_MODE])
Guido van Rossuma2baf461997-04-29 14:06:46 +000039 os.chmod(dst, mode)
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000040 os.utime(dst, (st[stat.ST_ATIME], st[stat.ST_MODE]))
Guido van Rossumc6360141990-10-13 19:23:40 +000041
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000042
Guido van Rossumc6360141990-10-13 19:23:40 +000043def copy(src, dst):
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000044 """Copy data and mode bits ("cp src dst").
45
46 The destination may be a directory.
47
48 """
Guido van Rossuma2baf461997-04-29 14:06:46 +000049 if os.path.isdir(dst):
50 dst = os.path.join(dst, os.path.basename(src))
51 copyfile(src, dst)
52 copymode(src, dst)
Guido van Rossumc6360141990-10-13 19:23:40 +000053
Guido van Rossumc6360141990-10-13 19:23:40 +000054def copy2(src, dst):
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000055 """Copy data and all stat info ("cp -p src dst").
56
57 The destination may be a directory.
58
59 """
Guido van Rossuma2baf461997-04-29 14:06:46 +000060 if os.path.isdir(dst):
61 dst = os.path.join(dst, os.path.basename(src))
62 copyfile(src, dst)
63 copystat(src, dst)
Guido van Rossumc6360141990-10-13 19:23:40 +000064
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000065
66def copytree(src, dst, symlinks=0):
67 """Recursively copy a directory tree using copy2().
68
69 The destination directory must not already exist.
70 Error are reported to standard output.
71
72 If the optional symlinks flag is true, symbolic links in the
73 source tree result in symbolic links in the destination tree; if
74 it is false, the contents of the files pointed to by symbolic
75 links are copied.
76
77 XXX Consider this example code rather than the ultimate tool.
78
79 """
Guido van Rossuma2baf461997-04-29 14:06:46 +000080 names = os.listdir(src)
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000081 os.mkdir(dst)
Guido van Rossuma2baf461997-04-29 14:06:46 +000082 for name in names:
83 srcname = os.path.join(src, name)
84 dstname = os.path.join(dst, name)
Guido van Rossuma2baf461997-04-29 14:06:46 +000085 try:
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000086 if symlinks and os.path.islink(srcname):
87 linkto = os.readlink(srcname)
88 os.symlink(linkto, dstname)
89 elif os.path.isdir(srcname):
Guido van Rossuma2baf461997-04-29 14:06:46 +000090 copytree(srcname, dstname)
91 else:
92 copy2(srcname, dstname)
93 # XXX What about devices, sockets etc.?
Guido van Rossum9d0a3df1997-04-29 14:45:19 +000094 except (IOError, os.error), why:
95 print "Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why))