Previous Page
Next Page

14.5. File Coercions

The various coercions and other forms of conversion that are and are not possible between a file specifier, a POSIX file (file URL ), an alias , and a string or Unicode text (which might represent a Macintosh pathname or a POSIX pathname), are enough to make your head swim. The trouble is that there are many things you can't do; at the same time, there's always a workaround if you're willing to jump through hoops.

A Macintosh pathname string can be used to form a file specifier or alias. (A file specifier cannot be assigned to a variable or displayed as a result, but a reference to it can be.) A POSIX pathname string can be used to form a POSIX file specifier. (See Chapter 13.) As I pointed out earlier in the chapter, these are not coercions.

An alias can be coerced to a string representing its Macintosh pathname, and its POSIX path property is a string representing its POSIX pathname. An alias cannot be coerced to a file object, but a string can be used as an intermediary to form a file specifier:

set a to alias "gromit:Users:matt2:reason:Resources:"
POSIX path of a -- "/Volumes/gromit/Users/matt2/reason/Resources/"
a as string -- "gromit:Users:matt2:reason:Resources:"
a reference to file (a as string)
-- file "gromit:Users:matt2:reason:Resources:" of «script»

A Macintosh pathname can be coerced to an alias. (The item denoted by the pathname must exist at runtime; see Chapter 13.)

set s to "gromit:Users:matt2:reason:Resources:"
s as alias -- alias "gromit:Users:matt2:reason:Resources:"

A file object cannot be coerced to a string. But a file object can be coerced to an alias (though in the Panther version of Script Editor there's a bug that makes it appear that it can't be), which in turn can be coerced to a string. A file object's POSIX path property is a string representing its POSIX pathname.

set f to a reference to file "gromit:Users:matt2:reason:Resources:"
f as alias -- alias "gromit:Users:matt2:reason:Resources:"
POSIX path of f -- "/Volumes/gromit/Users/matt2/reason/Resources/"

A POSIX file can be coerced to a string representing its Macintosh pathname . A string representing a POSIX path can be coerced to a POSIX file:

set s to "/Volumes/gromit/Users/matt2/reason/Resources/"
POSIX file s as string -- "gromit:Users:matt2:reason:Resources:"
s as POSIX file -- file "gromit:Users:matt2:reason:Resources:"

Because an item must exist in order to form an alias to it, coercion to an alias is a good way to test whether the item denoted by a pathname exists:

on pathExists of s given posixStyle:b
    try
        if b then
            POSIX file s as alias
        else
            s as alias
        end if
        return true
    on error
        return false
    end try
end pathExists
pathExists of "gromit:Users:matt2" without posixStyle -- true
pathExists of "/Volumes/gromit/Users/matt2" with posixStyle -- true

Throughout the preceding, wherever I say "string," you should understand "or Unicode text," as, strictly speaking, a string might not express all the characters that the filesystem text encoding can expresswhereas Unicode text should be able to do so.

I have found, though, that with some items on disk whose names contain Unicode-only characters, coercion between an alias and Unicode text, in either direction, can fail with a runtime error. This is probably a bug. The workaround is to construct an alias with an alias specifier, and use an alias's POSIX path property to obtain its pathname. To get a Macintosh pathname from an alias reliably, get its POSIX path property, form a POSIX file specifer, and coerce that to Unicode text.



Previous Page
Next Page