[Pythonmac-SIG] "Trashing" a file

Bob Ippolito bob at redivi.com
Sat May 7 01:00:16 CEST 2005


On May 6, 2005, at 6:31 PM, Niko Matsakis wrote:

> I am working on a python program that needs to trash some files.
> Ideally, I would like it to move them to the Trash, but I'm not quite
> sure what the best way to do this is.
>
> For context, I am using appscript to talk to iTunes and load its list
> of songs.  This works great.  Among other things, the program can then
> find albums that have multiple copies of the same track and purge  
> them.
>
> iTunes gives me back an FSAlias object as the location of the track,
> which appears to come from the much maligned Carbon standard module.
>
> I have tried deleting the file by doing:
>
>     appscript.app ('Finder').delete (aliasobject)
>
> This actually does work --- the Finder makes a little trashing noise,
> and the file ends up in the trash --- but it also throws an exception,
> which makes me mildly uncomfortable.  Here is the actual output:
>
>
>> ;pythonw test.py
>> Traceback (most recent call last):
>>   File "test.py", line 11, in ?
>>     app ('finder').delete (tr.location.get())
>>   File
>> "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/
>> python2.3/site-packages/appscript/specifier.py", line 168, in  
>> __call__
>>     raise CommandError("Can't do command %r(%s)" % (self, args and
>> kargs and args + ', ' + kargs or args or kargs), err, trace)
>> appscript.specifier.CommandError: Can't do command
>> app(u'/System/Library/CoreServices/
>> Finder.app').delete([<Carbon.File.Alias object at 0x5f100>,
>> <Carbon.File.Alias object at 0x5f110>]), Error 0: The operation could
>> not be completed.
>> ;
>>
>
> I mean, I could just catch and ignore this exception, but that seems
> bad.  Any suggestions on what the Right Thing To Do is?

I don't like dealing with apple events very much because they tend to  
be slow and/or unreliable.. but this is the Cocoa way to do it  
(untested, but should probably work):

from AppKit import *
import sys
import os

def groupFiles(files):
     dirs = {}
     enc = sys.getfilesystemencoding()
     for fn in files:
         if not isinstance(fn, unicode):
             fn = unicode(fn, enc)
         fn = os.path.realpath(fn)
         dirname, basename = os.path.splitext(fn)
         try:
             dirs[dirname].append(basename)
         except KeyError:
             dirs[dirname] = [basename]
     return dirs

def recycleFiles(files, ws=None):
     if ws is None:
         ws = NSWorkspace.sharedWorkspace()
     results = []
     for dirname, files in groupFiles(files).iteritems():
         res, tag =  
ws.performFileOperation_source_destination_files_tag_(
             NSWorkspaceRecycleOperation,
             dirname,
             u'',
             files)
         results.append((res, tag, dirname, files))
     return results

You would need to pass a sequence of paths to recycleFiles .. so  
you'd need to turn those FSAlias objects into POSIX paths (I don't  
remember how to do it off the top of my head).

> Incidentally, are there searchable archives for this list?  I couldn't
> seem to find any, just the month-by-month browsable ones...

I don't know.. but there's always Google.  A query that ends with  
"pythonmac-sig site:mail.python.org" sans quotes is probably only  
going to turn up results from this list.

-bob



More information about the Pythonmac-SIG mailing list