[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--