[Pythonmac-SIG] Fixfiletypes via IC (FC?)
Benjamin Schollnick
junkster@rochester.rr.com
Tue, 16 Apr 2002 16:58:25 -0400
> This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.
--MS_Mac_OE_3101821105_32195_MIME_Part
Content-type: text/plain; charset="US-ASCII"
Content-transfer-encoding: 7bit
This is what I would consider to be a final draft.... Or at least a early
final candidate...
Suggestions, improvements, etc.... Are more than welcome...
I've actually rolled back time a little bit, with a "fall back"
table, so that Python code can "always" be recognized, even if it's not in
the internet control panel....
- Benjamin
#
# Fixfiletypes - Set mac filetypes to something sensible,
# recursively down a directory tree.
#
# It will only touch extensions it feels pretty sure about.
# This script is useful after copying files from unix.
#
# Jack Jansen, CWI, 1995.
#
#
# Rewritten to use the IC module, and add progress meter, etc...
# Introduced for feedback & comments.
#
# Benjamin Schollnick, 4/16/2002
import os
import ic
import MacOS
import macfs
import sys
import macostools
import string
import EasyDialogs
on = 1
off = 0
#
# If "on", fixfile will warn if it needed to use the default/fallback
list.
#
default_warnings = on
#
# if "on", fixfile will warn if it was unable to match the file's
extension.
#
no_match_warnings = on
#
# Hardcoded Defaults for
#
# File Extension
# Creator Code
# Type Code
fallback_list = [
('.C', 'CWIE', 'TEXT'),
('.H', 'CWIE', 'TEXT'),
('.PY', 'Pyth', 'TEXT'),
('.PYC', 'Pyth', 'PYC '),
('.PYO', 'Pyth', 'PYC '),
]
class GUI_Features :
def __init__(self):
self.max_file_count = 0
self.current_file_count = 0
self.Progress_Bar = None
def set_max_files (self, count ):
self.max_file_count = count
def return_max_files (self):
return self.max_file_count
def increment_file_count (self, increment = 1 ):
self.current_file_count = self.current_file_count + increment
def return_incremental ( self ):
return self.current_file_count
def init_progress_bar ( self, text ):
self.Progress_Bar = EasyDialogs.ProgressBar ( text,
self.max_file_count )
def change_pb_text ( self, text ):
self.Progress_Bar.label ( text )
def refresh_progress_bar (self):
self.Progress_Bar.set ( self.current_file_count,
max=self.max_file_count)
class tree_file_count:
def __init__ ( self ):
self.file_count = 0
def walktree_count (self, args, dirname, names):
self.file_count = self.file_count + len(names)
def directory_to_count (self, pathname ):
os.path.walk ( pathname, self.walktree_count, None)
def total_files ( self ):
return self.file_count
def reset_to_zero ( self ):
self.file_count = 0
def walktree(name, change, g_app, total, IC):
if os.path.isfile(name) and not os.path.isdir (name):
try:
if name.endswith (".DS_Store"):
return
if os.path.splitext (name)[1] == "":
#
# There is no extension on this file...
#
return
fs = macfs.FSSpec(name)
creatorcode, typecode = fs.GetCreatorType ()
new_mapping = IC.mapfile ( name )
if (creatorcode <> new_mapping[2]) and (typecode <>
new_mapping[1]):
print "Reseting creator/type for: %s" %
os.path.split(name)[1]
IC.settypecreator ( name )
except MacOS.Error:
changed = 0
file_ext = os.path.splitext (name)[1].upper()
for ext, cr, tp in fallback_list:
if file_ext == ext:
fs = macfs.FSSpec(name)
if (creatorcode, typecode) <> (cr.upper(), tp.upper() ):
changed = 1
fs.SetCreatorType(cr, tp)
macostools.touched(fs)
if default_warnings:
print 'Used defaults: ', os.path.split(name)[1]
else:
print "Reseting creator/type for: %s" %
os.path.split(name)[1]
if changed == 0 and no_match_warnings==on:
print "Unable to match via IC Panel (%s)" %
os.path.split(name)[1]
elif os.path.isdir(name):
# print '->', name
files = os.listdir(name)
for f in files:
g_app.increment_file_count ()
g_app.change_pb_text ( "\t%s of %s" % (
g_app.return_incremental (), total.total_files () ) )
g_app.refresh_progress_bar ( )
walktree(os.path.join(name, f), change, g_app, total, IC )
def run( change ):
fss, ok = macfs.GetDirectory('Folder to search:')
if not ok:
sys.exit(0)
GUI = GUI_Features()
total_count = tree_file_count ()
total_count.directory_to_count ( fss.as_pathname() )
Internet_config = ic.IC ()
GUI.init_progress_bar ( "Files to Process" )
GUI.set_max_files ( total_count.total_files() )
walktree(fss.as_pathname(), change, GUI, total_count, Internet_config)
if __name__ == '__main__':
run(1)
--MS_Mac_OE_3101821105_32195_MIME_Part
Content-type: text/plain; name="ic_fixfile.py";
x-mac-creator="50797468";
x-mac-type="54455854"
Content-disposition: attachment
Content-transfer-encoding: base64
Iw0jIEZpeGZpbGV0eXBlcyAtIFNldCBtYWMgZmlsZXR5cGVzIHRvIHNvbWV0aGluZyBzZW5z
aWJsZSwNIyAgcmVjdXJzaXZlbHkgZG93biBhIGRpcmVjdG9yeSB0cmVlLg0jDSMgSXQgd2ls
bCBvbmx5IHRvdWNoIGV4dGVuc2lvbnMgaXQgZmVlbHMgcHJldHR5IHN1cmUgYWJvdXQuDSMg
VGhpcyBzY3JpcHQgaXMgdXNlZnVsIGFmdGVyIGNvcHlpbmcgZmlsZXMgZnJvbSB1bml4Lg0j
DSMgSmFjayBKYW5zZW4sIENXSSwgMTk5NS4NIw0NIw0jCVJld3JpdHRlbiB0byB1c2UgdGhl
IElDIG1vZHVsZSwgYW5kIGFkZCBwcm9ncmVzcyBtZXRlciwgZXRjLi4uDSMJSW50cm9kdWNl
ZCBmb3IgZmVlZGJhY2sgJiBjb21tZW50cy4NIw0jCUJlbmphbWluIFNjaG9sbG5pY2ssIDQv
MTYvMjAwMg0NaW1wb3J0IG9zDWltcG9ydCBpYw1pbXBvcnQgTWFjT1MNaW1wb3J0IG1hY2Zz
DWltcG9ydCBzeXMNaW1wb3J0IG1hY29zdG9vbHMNaW1wb3J0IHN0cmluZw1pbXBvcnQgRWFz
eURpYWxvZ3MNDW9uIAk9IDENb2ZmID0gMA0NIw0jCUlmICJvbiIsIGZpeGZpbGUgd2lsbCB3
YXJuIGlmIGl0IG5lZWRlZCB0byB1c2UgdGhlIGRlZmF1bHQvZmFsbGJhY2sgbGlzdC4NIw1k
ZWZhdWx0X3dhcm5pbmdzID0gb24NDSMNIwlpZiAib24iLCBmaXhmaWxlIHdpbGwgd2FybiBp
ZiBpdCB3YXMgdW5hYmxlIHRvIG1hdGNoIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uLg0jDW5vX21h
dGNoX3dhcm5pbmdzID0gb24NDQ0jDSMJSGFyZGNvZGVkIERlZmF1bHRzIGZvciANIw0JIyBG
aWxlIEV4dGVuc2lvbg0JCQkJIyBDcmVhdG9yIENvZGUNCQkJCQkJIyBUeXBlIENvZGUNZmFs
bGJhY2tfbGlzdCA9IFsNCSgnLkMnLCAJCSdDV0lFJywgJ1RFWFQnKSwNCSgnLkgnLCAJCSdD
V0lFJywgJ1RFWFQnKSwNCSgnLlBZJywgCSdQeXRoJywgJ1RFWFQnKSwNCSgnLlBZQycsIAkn
UHl0aCcsICdQWUMgJyksDQkoJy5QWU8nLCAJJ1B5dGgnLCAnUFlDICcpLA1dDQ1jbGFzcwkJ
R1VJX0ZlYXR1cmVzIDoNCWRlZgkJX19pbml0X18oc2VsZik6DQkJc2VsZi5tYXhfZmlsZV9j
b3VudAkJPSAwDQkJc2VsZi5jdXJyZW50X2ZpbGVfY291bnQJPSAwDQkJc2VsZi5Qcm9ncmVz
c19CYXIJCT0gTm9uZQ0JCQ0JZGVmCQlzZXRfbWF4X2ZpbGVzIChzZWxmLCBjb3VudCApOg0J
CXNlbGYubWF4X2ZpbGVfY291bnQJCT0gY291bnQNCQkNCWRlZgkJcmV0dXJuX21heF9maWxl
cyAoc2VsZik6DQkJcmV0dXJuIHNlbGYubWF4X2ZpbGVfY291bnQNCQkNCWRlZgkJaW5jcmVt
ZW50X2ZpbGVfY291bnQgKHNlbGYsIGluY3JlbWVudCA9IDEgKToNCQlzZWxmLmN1cnJlbnRf
ZmlsZV9jb3VudCA9IHNlbGYuY3VycmVudF9maWxlX2NvdW50ICsgaW5jcmVtZW50DQkJDQlk
ZWYJCXJldHVybl9pbmNyZW1lbnRhbCAoIHNlbGYgKToNCQlyZXR1cm4gc2VsZi5jdXJyZW50
X2ZpbGVfY291bnQNCQkNCWRlZglpbml0X3Byb2dyZXNzX2JhciAoIHNlbGYsIHRleHQgKToN
CQlzZWxmLlByb2dyZXNzX0JhciA9IEVhc3lEaWFsb2dzLlByb2dyZXNzQmFyICggdGV4dCwg
c2VsZi5tYXhfZmlsZV9jb3VudCApDQkNCWRlZgljaGFuZ2VfcGJfdGV4dCAgKCBzZWxmLCB0
ZXh0ICk6DQkJc2VsZi5Qcm9ncmVzc19CYXIubGFiZWwgKCB0ZXh0ICkNCQkNCWRlZglyZWZy
ZXNoX3Byb2dyZXNzX2JhciAoc2VsZik6DQkJc2VsZi5Qcm9ncmVzc19CYXIuc2V0ICggc2Vs
Zi5jdXJyZW50X2ZpbGVfY291bnQsIG1heD1zZWxmLm1heF9maWxlX2NvdW50KQ0NY2xhc3MJ
dHJlZV9maWxlX2NvdW50Og0JZGVmCV9faW5pdF9fICggc2VsZiApOg0JCXNlbGYuZmlsZV9j
b3VudCA9IDANDQlkZWYJd2Fsa3RyZWVfY291bnQgKHNlbGYsIGFyZ3MsIGRpcm5hbWUsIG5h
bWVzKToNCQlzZWxmLmZpbGVfY291bnQgPSBzZWxmLmZpbGVfY291bnQgKyBsZW4obmFtZXMp
DQ0JZGVmCWRpcmVjdG9yeV90b19jb3VudCAoc2VsZiwgcGF0aG5hbWUgKToNCQlvcy5wYXRo
LndhbGsgKCBwYXRobmFtZSwgc2VsZi53YWxrdHJlZV9jb3VudCwgTm9uZSkNDQlkZWYJdG90
YWxfZmlsZXMgKCBzZWxmICk6DQkJcmV0dXJuIHNlbGYuZmlsZV9jb3VudA0JCQ0JZGVmCXJl
c2V0X3RvX3plcm8gKCBzZWxmICk6DQkJc2VsZi5maWxlX2NvdW50ID0gMA0JCQ0JCQ1kZWYg
d2Fsa3RyZWUobmFtZSwgY2hhbmdlLCBnX2FwcCwgdG90YWwsIElDKToNCWlmIG9zLnBhdGgu
aXNmaWxlKG5hbWUpIGFuZCBub3Qgb3MucGF0aC5pc2RpciAobmFtZSk6DQkJdHJ5Og0JCQlp
ZiBuYW1lLmVuZHN3aXRoICgiLkRTX1N0b3JlIik6DQkJCQlyZXR1cm4NDQkJCWlmIG9zLnBh
dGguc3BsaXRleHQgKG5hbWUpWzFdID09ICIiOg0JCQkJIw0JCQkJIwlUaGVyZSBpcyBubyBl
eHRlbnNpb24gb24gdGhpcyBmaWxlLi4uDQkJCQkjDQkJCQlyZXR1cm4NCQkJDQkJCWZzID0g
bWFjZnMuRlNTcGVjKG5hbWUpDQkJCWNyZWF0b3Jjb2RlLCB0eXBlY29kZSA9IGZzLkdldENy
ZWF0b3JUeXBlICgpDQ0JCQluZXdfbWFwcGluZyA9IElDLm1hcGZpbGUgKCBuYW1lICkNCQkJ
DQkJCWlmIChjcmVhdG9yY29kZSA8PiBuZXdfbWFwcGluZ1syXSkgYW5kICh0eXBlY29kZSA8
PiBuZXdfbWFwcGluZ1sxXSk6DQkJCQlwcmludCAiUmVzZXRpbmcgY3JlYXRvci90eXBlIGZv
cjogJXMiICUgb3MucGF0aC5zcGxpdChuYW1lKVsxXQ0JCQkJDQkJCUlDLnNldHR5cGVjcmVh
dG9yICggbmFtZSApDQkJZXhjZXB0IE1hY09TLkVycm9yOg0NCQkJY2hhbmdlZCA9IDANCQkJ
ZmlsZV9leHQgPSBvcy5wYXRoLnNwbGl0ZXh0IChuYW1lKVsxXS51cHBlcigpDQkJCWZvciBl
eHQsIGNyLCB0cCBpbiBmYWxsYmFja19saXN0Og0JCQkJaWYgZmlsZV9leHQgPT0gZXh0Og0J
CQkJCWZzID0gbWFjZnMuRlNTcGVjKG5hbWUpDQkJCQkJaWYgKGNyZWF0b3Jjb2RlLCB0eXBl
Y29kZSkgPD4gKGNyLnVwcGVyKCksIHRwLnVwcGVyKCkgKToNCQkJCQkJY2hhbmdlZCA9IDEN
CQkJCQkJZnMuU2V0Q3JlYXRvclR5cGUoY3IsIHRwKQ0JCQkJCQltYWNvc3Rvb2xzLnRvdWNo
ZWQoZnMpDQkJCQkJCWlmIGRlZmF1bHRfd2FybmluZ3M6DQkJCQkJCQlwcmludCAnVXNlZCBk
ZWZhdWx0czogJywgb3MucGF0aC5zcGxpdChuYW1lKVsxXQ0JCQkJCQllbHNlOg0JCQkJCQkJ
cHJpbnQgIlJlc2V0aW5nIGNyZWF0b3IvdHlwZSBmb3I6ICVzIiAlIG9zLnBhdGguc3BsaXQo
bmFtZSlbMV0NDQkJCWlmIGNoYW5nZWQgPT0gMCBhbmQgbm9fbWF0Y2hfd2FybmluZ3M9PW9u
Og0JCQkJcHJpbnQgIlVuYWJsZSB0byBtYXRjaCB2aWEgSUMgUGFuZWwgKCVzKSIgJSBvcy5w
YXRoLnNwbGl0KG5hbWUpWzFdDQ0JCQkJDQ0JZWxpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOg0j
CQlwcmludCAnLT4nLCBuYW1lDQkJZmlsZXMgPSBvcy5saXN0ZGlyKG5hbWUpDQkJZm9yIGYg
aW4gZmlsZXM6DQkJCWdfYXBwLmluY3JlbWVudF9maWxlX2NvdW50ICgpDQkJCWdfYXBwLmNo
YW5nZV9wYl90ZXh0ICAoICJcdCVzIG9mICVzIiAlICggZ19hcHAucmV0dXJuX2luY3JlbWVu
dGFsICgpLCB0b3RhbC50b3RhbF9maWxlcyAoKSApICkNCQkJZ19hcHAucmVmcmVzaF9wcm9n
cmVzc19iYXIgKCApDQ0JCQl3YWxrdHJlZShvcy5wYXRoLmpvaW4obmFtZSwgZiksIGNoYW5n
ZSwgZ19hcHAsIHRvdGFsLCBJQyApDQkJDQkJDQkJCQkJDWRlZiBydW4oIGNoYW5nZSApOg0J
DQlmc3MsIG9rID0gbWFjZnMuR2V0RGlyZWN0b3J5KCdGb2xkZXIgdG8gc2VhcmNoOicpDQlp
ZiBub3Qgb2s6DQkJc3lzLmV4aXQoMCkNDQkNCUdVSSAJCQk9IEdVSV9GZWF0dXJlcygpDQl0
b3RhbF9jb3VudCAJPSB0cmVlX2ZpbGVfY291bnQgKCkNCXRvdGFsX2NvdW50LmRpcmVjdG9y
eV90b19jb3VudCAoIGZzcy5hc19wYXRobmFtZSgpICkNCUludGVybmV0X2NvbmZpZyA9IGlj
LklDICgpDQkNCUdVSS5pbml0X3Byb2dyZXNzX2JhciAoICJGaWxlcyB0byBQcm9jZXNzIiAp
DQlHVUkuc2V0X21heF9maWxlcyAoIHRvdGFsX2NvdW50LnRvdGFsX2ZpbGVzKCkgKQ0JDQl3
YWxrdHJlZShmc3MuYXNfcGF0aG5hbWUoKSwgY2hhbmdlLCBHVUksIHRvdGFsX2NvdW50LCBJ
bnRlcm5ldF9jb25maWcpDQkNaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoNCXJ1bigxKQ0J
DQkN
--MS_Mac_OE_3101821105_32195_MIME_Part--