More Finder Scripting
Volume Number: 20 (2004)
Issue Number: 11
Column Tag: Programming
More Finder Scripting
by Benjamin S. Waldie
We've taken a look at some basic Finder scripting, including creating, naming, and updating
folders. This month, let's expand a bit further, and begin looking at some other scriptable Finder
functionality.
Manipulating Finder objects
In this article, when I refer to a Finder "item" or "object", please note that I am simply
referring generically to either a file or a folder.
Opening
We have already seen how the following code can be used to open a folder using the Finder:
tell application "Finder"
set theFolder to make new folder at desktop with properties {name:"My Folder"}
open theFolder
end tell
You may also have the need to open a file using the Finder. To simply open a file, the
AppleScript syntax is the same:
set theFile to choose file
tell application "Finder"
open theFile
end tell
In some cases, you may want to open a file using a specific application. For example, let's say
that you have a Photoshop or ImageReady droplet, or an AppleScript droplet, and you want to process
one or more dropped items. You can do this with AppleScript in the Finder by making use of the
using parameter along with the open command.
set theApplication to choose application as alias
set theFile to choose file
tell application "Finder"
open theFile using theApplication
end tell
Revealing
If you simply want to locate and navigate to an item in the Finder, you can use the reveal
command. This will locate the object in the Finder, open a new window if necessary, display and
select the specified object.
set theFile to choose file
tell application "Finder"
reveal theFile
end tell
Moving
Moving files and folders around is another common task involving the Finder. To move a file or
folder, use the move command.
set theFile to choose file
set theDestinationFolder to choose folder with prompt "Please select a destination folder:"
tell application "Finder"
move theFile to theDestinationFolder
end tell
By default, the move command will not automatically replace existing items in the destination
location with the same name. If you want to replace existing items in any situation, then you can
simply use the replacing parameter to indicate that any existing items should be replaced, if
necessary. For example:
tell application "Finder"
move theFile to theDestinationFolder replacing true
end tell
If you do not want to replace existing items, but you still want to move the item to the
destination folder, then you will need to create custom code to handle the situation as you see fit.
For example, if you wanted to add a unique numeric suffix to the item name, and then move it, you
could use the following code:
set theFile to choose file
set theDestinationFolder to choose folder with prompt "Please select a destination folder:"
tell application "Finder"
set theFileName to name of theFile
set thePathToCheck to theDestinationFolder & theFileName as string
if item thePathToCheck exists then
set theSuffix to 1
repeat
if (item (thePathToCheck & theSuffix) exists) = false then exit repeat
set theSuffix to theSuffix + 1
end repeat
set name of theFile to theFileName & theSuffix
end if
move theFile to theDestinationFolder
end tell
Duplicating
To copy an item, you need to use the duplicate command, rather than the copy command. For
example:
set theFile to choose file
set theDestinationFolder to choose folder with prompt "Please select a destination folder:"
tell application "Finder"
duplicate theFile to theDestinationFolder
end tell
As of the writing of this article, the Finder dictionary did indicate the presence of a copy
command. However, this command was not yet implemented in the Mac OS X Panther (10.3.3) Finder. In
addition, once functional, the copy command will be used to copy items to the clipboard, rather than
to copy them from one location to another.
Duplicating is similar to moving, in that it will not automatically replace existing items with
the same names. In order to replace existing items, you need to use the replacing parameter.
tell application "Finder"
duplicate theFile to theDestinationFolder replacing true
end tell
If you do not want to replace existing items in a destination folder, but you still want to copy
an item to the destination folder, then you will need to create code to handle this situation. For
example:
set theFile to choose file
set theDestinationFolder to choose folder with prompt "Please select a destination folder:"
tell application "Finder"
set theFileName to name of theFile
set thePathToCheck to theDestinationFolder & theFileName as string
if item thePathToCheck exists then
set theSuffix to 1
repeat
if (item (thePathToCheck & theSuffix) exists) = false then exit repeat
set theSuffix to theSuffix + 1
end repeat
set name of theFile to theFileName & theSuffix
end if
duplicate theFile to theDestinationFolder
end tell
Deleting
To delete an item, use the delete command:
set theFile to choose file
tell application "Finder"
delete theFile
end tell
Please note that the delete command will not actually delete an item. Rather, it will move the
item to the trash, where it may be retrieved until the trash has been emptied. If you want to fully
delete a file, you will need to tell the Finder to empty the trash after performing the deletion.
For example:
set theFile to choose file
tell application "Finder"
delete theFile
empty the trash
end tell
Keep in mind that by emptying the trash, you will be removing any other items residing in the
trash as well.
Getting Object Info
When working with an item in the Finder, you will probably want to retrieve information about the
item. You can do this by accessing the properties of the desired object. Common properties shared
by both files, folders, and disks can be found under the Finder Items suite in the Finder
dictionary.
Figure 1. Finder
Dictionary > Finder Item Detail
Some commonly accessed properties of Finder items include the modification date, name, and size
of the item. For example:
set theFile to choose file
tell application "Finder"
set theModDate to modification date of theFile
set theName to name of theFile
set theSize to size of theFile
end tell
In addition to these common properties, files, folders, and disks also have additional properties
specific to their particular class. For example, files have a file type and creator type property,
whereas folders and disks have other properties not possessed by files. For example:
set theFile to choose file
tell application "Finder"
set theFileType to file type of theFile
set theCreatorType to creator type of theFile
end tell
Some developers prefer to avoid scripting the Finder when possible, and resort instead to using a
scripting addition to access certain properties of files and folders. The Standard Additions
scripting addition, which is installed with Mac OS X, contains a command for just this task - info
for. This command may be used to retrieve a variety of properties for files and folders, such as
name, modification date, size, and more. For example:
- set theFile to choose file
- set theFileInfo to info for theFile
- set theName to name of theFileInfo
- set theModDate to modification date of theFileInfo
- set theSize to size of theFileInfo
What About System Events?
If you have done some scripting in Mac OS X before, then you may be somewhat familiar with the
System Events background application. This application allows you to automate various system
related activities.
Figure 2. The System
Events Dictionary Window
Some of the commands in the System Events dictionary are very similar to commands found in the
Finder dictionary, including the delete, move, and open commands. For these specific commands,
System Events may be used instead of the Finder. However, please note that certain parameters,
which are present when scripting the Finder, are not present when scripting System Events. For
example, when moving an item using System Events, there is not currently a way to specify whether
existing items should be overwritten. When using this command, items will never be overwritten.
set theFile to (choose file) as string
set theDestinationFolder to choose folder
tell application "System Events"
move disk item theFile to theDestinationFolder
end tell
The System Events dictionary has expanded significantly with the last few major Mac OS X
releases, and I expect it to continue to expand in the future. My guess is that more Finder-like
functionality will continue to be built into System Events with every major OS release. System
Events contains much more than the few commands I mentioned above, and I encourage you to explore it
in greater detail in order to find out more about what System Events has to offer.
In Closing
This month's article should take you a little further down the road of Finder scripting. For
some editable examples of Finder scripting, you may want to check out the example Finder scripts
included with Mac OS X. These can be found in the Library > Scripts > Finder Scripts folder on your
machine. In addition, Apple's AppleScript web site contains some Finder scripts, which can be
triggered from the Finder's toolbar. For additional information about all of these scripts, as well
as links to download the toolbar scripts, please visit http://www.apple.com/applescript/finder/.
Until next time, keep scripting!
Benjamin Waldie is president of Automated Workflows, LLC, a firm
specializing in AppleScript and workflow automation consulting. In addition to his role as a
consultant, Benjamin is an evangelist of AppleScript, and can frequently be seen presenting at
Macintosh User Groups, Seybold Seminars, and MacWorld. For additional information about Benjamin,
please visit http://www.automatedworkflows.com, or email Benjamin at applescriptguru@mac.com.applescriptguru@mac.com.