]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Useful routines on a mac:
authorJack Jansen <jack.jansen@cwi.nl>
Mon, 14 Aug 1995 12:38:42 +0000 (12:38 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Mon, 14 Aug 1995 12:38:42 +0000 (12:38 +0000)
- mkalias makes a finder alias
- copy copies a file, finder info, resources and all.
- copytree does the same for a whole tree.

Mac/Lib/macostools.py [new file with mode: 0644]

diff --git a/Mac/Lib/macostools.py b/Mac/Lib/macostools.py
new file mode 100644 (file)
index 0000000..309f960
--- /dev/null
@@ -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)