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 FSSpecType
= type(macfs
.FSSpec(':'))
23 BUFSIZ
=0x80000 # Copy in 0.5Mb chunks
26 # Not guaranteed to be correct or stay correct (Apple doesn't tell you
27 # how to do this), but it seems to work.
29 def mkalias(src
, dst
, relative
=None):
30 """Create a finder alias"""
31 srcfss
= macfs
.FSSpec(src
)
32 dstfss
= macfs
.FSSpec(dst
)
34 relativefss
= macfs
.FSSpec(relative
)
35 # ik mag er geen None in stoppen :-(
36 alias
= srcfss
.NewAlias(relativefss
)
38 alias
= srcfss
.NewAlias()
39 srcfinfo
= srcfss
.GetFInfo()
41 Res
.FSpCreateResFile(dstfss
, srcfinfo
.Creator
, srcfinfo
.Type
, -1)
42 h
= Res
.FSpOpenResFile(dstfss
, 3)
43 resource
= Res
.Resource(alias
.data
)
44 resource
.AddResource('alis', 0, '')
47 dstfinfo
= dstfss
.GetFInfo()
48 dstfinfo
.Flags
= dstfinfo
.Flags|
0x8000 # Alias flag
49 dstfss
.SetFInfo(dstfinfo
)
52 """Make directories leading to 'dst' if they don't exist yet"""
53 if dst
== '' or os
.path
.exists(dst
):
55 head
, tail
= os
.path
.split(dst
)
62 """Tell the finder a file has changed"""
63 file_fss
= macfs
.FSSpec(dst
)
64 vRefNum
, dirID
, name
= file_fss
.as_tuple()
65 dir_fss
= macfs
.FSSpec((vRefNum
, dirID
, ''))
66 crdate
, moddate
, bkdate
= dir_fss
.GetDates()
70 dir_fss
.SetDates(crdate
, now
, bkdate
)
73 """Tell the finder a file has changed"""
76 file_fss
= macfs
.FSSpec(dst
)
77 vRefNum
, dirID
, name
= file_fss
.as_tuple()
78 dir_fss
= macfs
.FSSpec((vRefNum
, dirID
, ''))
81 def copy(src
, dst
, createpath
=0, copydates
=1, forcetype
=None):
82 """Copy a file, including finder info, resource fork, etc"""
84 mkdirs(os
.path
.split(dst
)[0])
85 srcfss
= macfs
.FSSpec(src
)
86 dstfss
= macfs
.FSSpec(dst
)
88 ifp
= open(srcfss
.as_pathname(), 'rb')
89 ofp
= open(dstfss
.as_pathname(), 'wb')
97 ifp
= openrf(srcfss
.as_pathname(), '*rb')
98 ofp
= openrf(dstfss
.as_pathname(), '*wb')
106 sf
= srcfss
.GetFInfo()
107 df
= dstfss
.GetFInfo()
108 df
.Creator
, df
.Type
= sf
.Creator
, sf
.Type
109 if forcetype
!= None:
111 df
.Flags
= (sf
.Flags
& (kIsStationary|kNameLocked|kHasBundle|kIsInvisible|kIsAlias
))
114 crdate
, mddate
, bkdate
= srcfss
.GetDates()
115 dstfss
.SetDates(crdate
, mddate
, bkdate
)
118 def copytree(src
, dst
, copydates
=1):
119 """Copy a complete file tree to a new destination"""
120 if os
.path
.isdir(src
):
122 files
= os
.listdir(src
)
124 copytree(os
.path
.join(src
, f
), os
.path
.join(dst
, f
), copydates
)
126 copy(src
, dst
, 1, copydates
)