1 """macostools - Various utility functions for MacOS.
3 mkalias(src, dst) - Create a finder alias 'dst' pointing to 'src'
4 copy(src, dst) - Full copy of 'src' to 'dst'
15 except AttributeError:
16 # Backward compatability
19 Error
= 'macostools.Error'
21 BUFSIZ
=0x80000 # Copy in 0.5Mb chunks
24 # Not guaranteed to be correct or stay correct (Apple doesn't tell you
25 # how to do this), but it seems to work.
27 def mkalias(src
, dst
, relative
=None):
28 """Create a finder alias"""
29 srcfss
= macfs
.FSSpec(src
)
30 dstfss
= macfs
.FSSpec(dst
)
32 relativefss
= macfs
.FSSpec(relative
)
33 # ik mag er geen None in stoppen :-(
34 alias
= srcfss
.NewAlias(relativefss
)
36 alias
= srcfss
.NewAlias()
38 if os
.path
.isdir(src
):
39 cr
, tp
= 'MACS', 'fdrp'
41 cr
, tp
= srcfss
.GetCreatorType()
43 Res
.FSpCreateResFile(dstfss
, cr
, tp
, -1)
44 h
= Res
.FSpOpenResFile(dstfss
, 3)
45 resource
= Res
.Resource(alias
.data
)
46 resource
.AddResource('alis', 0, '')
49 dstfinfo
= dstfss
.GetFInfo()
50 dstfinfo
.Flags
= dstfinfo
.Flags|
0x8000 # Alias flag
51 dstfss
.SetFInfo(dstfinfo
)
54 """Make directories leading to 'dst' if they don't exist yet"""
55 if dst
== '' or os
.path
.exists(dst
):
57 head
, tail
= os
.path
.split(dst
)
64 """Tell the finder a file has changed"""
65 file_fss
= macfs
.FSSpec(dst
)
66 vRefNum
, dirID
, name
= file_fss
.as_tuple()
67 dir_fss
= macfs
.FSSpec((vRefNum
, dirID
, ''))
68 crdate
, moddate
, bkdate
= dir_fss
.GetDates()
72 dir_fss
.SetDates(crdate
, now
, bkdate
)
75 """Tell the finder a file has changed"""
78 file_fss
= macfs
.FSSpec(dst
)
79 vRefNum
, dirID
, name
= file_fss
.as_tuple()
80 dir_fss
= macfs
.FSSpec((vRefNum
, dirID
, ''))
83 def copy(src
, dst
, createpath
=0, copydates
=1, forcetype
=None):
84 """Copy a file, including finder info, resource fork, etc"""
86 mkdirs(os
.path
.split(dst
)[0])
87 srcfss
= macfs
.FSSpec(src
)
88 dstfss
= macfs
.FSSpec(dst
)
90 ifp
= open(srcfss
.as_pathname(), 'rb')
91 ofp
= open(dstfss
.as_pathname(), 'wb')
99 ifp
= openrf(srcfss
.as_pathname(), '*rb')
100 ofp
= openrf(dstfss
.as_pathname(), '*wb')
108 sf
= srcfss
.GetFInfo()
109 df
= dstfss
.GetFInfo()
110 df
.Creator
, df
.Type
= sf
.Creator
, sf
.Type
111 if forcetype
!= None:
113 df
.Flags
= (sf
.Flags
& (kIsStationary|kNameLocked|kHasBundle|kIsInvisible|kIsAlias
))
116 crdate
, mddate
, bkdate
= srcfss
.GetDates()
117 dstfss
.SetDates(crdate
, mddate
, bkdate
)
120 def copytree(src
, dst
, copydates
=1):
121 """Copy a complete file tree to a new destination"""
122 if os
.path
.isdir(src
):
124 files
= os
.listdir(src
)
126 copytree(os
.path
.join(src
, f
), os
.path
.join(dst
, f
), copydates
)
128 copy(src
, dst
, 1, copydates
)