

|
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.
Warning: include(/home/cust10011/www/site001/includes-mactech/includefiles/mt_footer.inc) [function.include]: failed to open stream: No such file or directory in /home/cust10011/www/site001_files/staticcontent/articles/mactech/Vol.20/20.11/MoreFinderScripting/index.html on line 294
Warning: include() [function.include]: Failed opening '/home/cust10011/www/site001/includes-mactech/includefiles/mt_footer.inc' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /home/cust10011/www/site001_files/staticcontent/articles/mactech/Vol.20/20.11/MoreFinderScripting/index.html on line 294