summaryrefslogtreecommitdiffstats
path: root/Mac/Lib
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>1995-08-14 12:38:42 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>1995-08-14 12:38:42 (GMT)
commit01c2309f2d5cc86300bd3005412c39ce190cfcfc (patch)
treedeea72a364191ef0174a8054a4cd066627138ceb /Mac/Lib
parent32486f5662b55fdbe065952c9d66da43eca2ed8c (diff)
downloadcpython-01c2309f2d5cc86300bd3005412c39ce190cfcfc.zip
cpython-01c2309f2d5cc86300bd3005412c39ce190cfcfc.tar.gz
cpython-01c2309f2d5cc86300bd3005412c39ce190cfcfc.tar.bz2
Useful routines on a mac:
- mkalias makes a finder alias - copy copies a file, finder info, resources and all. - copytree does the same for a whole tree.
Diffstat (limited to 'Mac/Lib')
-rw-r--r--Mac/Lib/macostools.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/Mac/Lib/macostools.py b/Mac/Lib/macostools.py
new file mode 100644
index 0000000..309f960
--- /dev/null
+++ b/Mac/Lib/macostools.py
@@ -0,0 +1,77 @@
+"""macostools - Various utility functions for MacOS.
+
+mkalias(src, dst) - Create a finder alias 'dst' pointing to 'src'
+copy(src, dst) - Full copy of 'src' to 'dst'
+"""
+
+import macfs
+import Res
+import os
+
+Error = 'macostools.Error'
+
+FSSpecType = type(macfs.FSSpec(':'))
+
+BUFSIZ=0x100000 # Copy in 1Mb chunks
+
+#
+# Not guaranteed to be correct or stay correct (Apple doesn't tell you
+# how to do this), but it seems to work.
+#
+def mkalias(src, dst):
+ """Create a finder alias"""
+ srcfss = macfs.FSSpec(src)
+ dstfss = macfs.FSSpec(dst)
+ alias = srcfss.NewAlias()
+ srcfinfo = srcfss.GetFInfo()
+
+ Res.FSpCreateResFile(dstfss, srcfinfo.Creator, srcfinfo.Type, -1)
+ h = Res.FSpOpenResFile(dstfss, 3)
+ resource = Res.Resource(alias.data)
+ resource.AddResource('alis', 0, '')
+ Res.CloseResFile(h)
+
+ dstfinfo = dstfss.GetFInfo()
+ dstfinfo.Flags = dstfinfo.Flags|0x8000 # Alias flag
+ dstfss.SetFInfo(dstfinfo)
+
+def copy(src, dst):
+ """Copy a file, including finder info, resource fork, etc"""
+ srcfss = macfs.FSSpec(src)
+ dstfss = macfs.FSSpec(dst)
+
+ ifp = fopen(srcfss.as_pathname(), 'rb')
+ ofp = fopen(dstfss.as_pathname(), 'wb')
+ d = ifp.read(BUFSIZ)
+ while d:
+ ofp.write(d)
+ d = ifp.read(BUFSIZ)
+ ifp.close()
+ ofp.close()
+
+ ifp = fopen(srcfss.as_pathname(), '*rb')
+ ofp = fopen(dstfss.as_pathname(), '*wb')
+ d = ifp.read(BUFSIZ)
+ while d:
+ ofp.write(d)
+ d = ifp.read(BUFSIZ)
+ ifp.close()
+ ofp.close()
+
+ sf = srcfss.GetFInfo()
+ df = dstfss.GetFInfo()
+ df.Creator, df.Type, df.Flags = sf.Creator, sf.Type, sf.Flags
+ dstfss.SetFInfo(df)
+
+def copytree(src, dst):
+ """Copy a complete file tree to a new destination"""
+ if os.path.isdir(src):
+ if not os.path.exists(dst):
+ os.mkdir(dst)
+ elif not os.path.isdir(dst):
+ raise Error, 'Not a directory: '+dst
+ files = os.listdir(src)
+ for f in files:
+ copytree(os.path.join(src, f), os.path.join(dst, f))
+ else:
+ copy(src, dst)