
General purpose routines for dealing with files and folders.
Takes path string of a file or folder (assumes a colon delimited string) and returns a list containing its name and path. Much faster than using the Finder.
USAGE: set {thisName, thisPath} to nameAndPath out of "Path:to:some:item:or:another"
--> {"another", "Path:to:some:item:or:"}
Input: colon delimited string - designed for paths of files & folders.
Output: list of strings - the file's name & the path to it.
Error:
-- nameAndPath -- by Richard Morton, 1999 --
-- Return the name of and path to an item
-- Pass a path string
on nameAndPath out of pathString
tell AppleScript
set olD to text item delimiters
set text item delimiters to ":"
set reqItem to -1
if last item of pathString = ":" then set reqItem to -2
set theName to text item reqItem of pathString
try
set thePath to ((text items 1 through (reqItem - 1) of pathString) as string) & ":"
on error -- it's a disk
set thePath to theName & ":"
end try
set text item delimiters to olD
return {theName, thePath}
end tell
end nameAndPath
Fast way to check an item's existence - much quicker than using the Finder. Can return erroneous true results if passed some types of bad data - see note - but is otherwise fairly robust.
USAGE: set itsHere to itemExists against "No:Way:Mandalay"
--> false
OR:
if (itemExists against "Path:to:something:that:might:be:there") then
doSomething() -- action to take if the item exists
else
doSomethingElse() -- action to take if the item does not exist
end if
Input: string - full path to a file or folder that may or may not exist.
Output: boolean - true if the items exists, otherwise false
Error: false for any condition other than the item existing.
Note: Expect this to return erroneous true values when passed a path that includes consecutive colons - "existingVolume:existingFolder::" - or a string containing just colons - "::"
-- itemExists -- by Richard Morton, 2000 --
-- Determine whether an item exists
-- Pass a path string
on itemExists at pathString
if pathString ≠ "" then try
get alias pathString
return true
end try
return false
end itemExists
Search a list of folders (including sub-folders) for files whose name contains a given string or list of strings. The searchFolderList parameter can be a list of aliases or full path strings to folders. searchStrings can be a string or a list of strings.
I used to use Tanaka's osax for this task in classic MacOS, but I had to come up with another way of doing it under OS X. This uses the do shell script command from the Standard Additions osax to call the unix find command. This is much faster than using the Finder's entire contents clause.
USAGE: set filePathStrings to findFilesWhoseNameContains({"MacHD:folder1:", "MacHD:folder2:"}, {"foo", "bar"})
--> {"MacHD:folder1:fooFile", "MacHD:folder1:fooFolder:fooBar", "MacHD:folder2:foodFolder:foodFile", "MacHD:folder2:foodFolder:foods:food_is_good", "MacHD:folder2:otherFolder:bars:bars_are_good"}
Input:
searchFolderList list - an AS list of aliases to, or full path strings of, folders.
searchStrings string or list of strings - the string(s) to look for in the names of the files. Case insensitive.
Output: list - full path strings of the found files.
Error: I get occasional crashes when calling this from inside some apps, but I don't think it's because of the handler itself.
-- findFilesWhoseNameContains -- by Richard Morton, 2003 --
-- Recursively search for files whose name contains the search string(s)
-- Pass a list of folders (aliases or fullpath strings)
-- and a search string or list of search strings
on findFilesWhoseNameContains(searchFolderList, searchStrings)
set dir to ""
repeat with n from 1 to length of searchFolderList -- build a string of directories out of the list of aliases or mac path strings
set dir to dir & space & quoted form of (text 1 through -2 of POSIX path of (item n of searchFolderList))
end repeat
set inmSta to " -iname '*" -- these set up the strings to feed to the unix 'find' command
set inmEnd to "*'"
if class of searchStrings is in {string, Unicode text} then -- a single string to search for in the file name
set shSrcStr to inmSta & searchStrings & inmEnd
else if class of searchStrings is list then -- two or more search strings
set shSrcStr to ""
repeat with m from 1 to length of searchStrings
set shSrcStr to shSrcStr & inmSta & item m of searchStrings & inmEnd
end repeat
else -- might as well add parameter checking while we're here
error "'findFilesWhoseNameContains' requires a string or list of strings as its 'searchString' parameter" number -1703 -- errAEWrongDataType
end if
set shellOut to do shell script "find" & dir & shSrcStr & " -type f" -- return every file in the search folder(s) that match (includes alias files)
set outList to {}
if shellOut is not "" then
tell AppleScript
set oT to text item delimiters
set text item delimiters to return
set foundList to text items of shellOut -- tokenise the string
set text item delimiters to oT
end tell
repeat with p from 1 to length of foundList
set end of outList to POSIX file (item p of foundList) as string -- make posix paths into Mac path strings
end repeat
end if
return outList
end findFilesWhoseNameContains
Takes a file name (string) and splits the extension, returning both in a list.
USAGE: set {fileName, fileExt} to splitExtension from "some.File.txt"
--> {"some.File", ".txt"}
Input: string - a file name.
Output: list of strings - the file's name & its extension.
Error: Handles names without extensions & names with dots OK. Works by splitting at the last dot, so will split a file name that contains one, but has no extension.
-- splitExtension -- by Richard Morton, 2003 --
-- Split the extension from a file name
-- Pass a file name, returns list - name & extension
to splitExtension from fileName
set dot to "."
tell AppleScript
set oT to text item delimiters
set text item delimiters to dot
if (count text items of fileName) > 1 then -- there is an extension
set outName to (text items 1 through -2 of fileName) as string
set ext to last text item of fileName
else
set outName to fileName
set ext to ""
end if
set text item delimiters to oT
if ext is not "" then set ext to dot & ext -- if there's an extension, add a leading dot to it
return {outName, ext}
end tell
end splitExtension
The FooDoo Lounge is Copyright © Richard Morton 2002-2005
|| url: http://www.foodoo.sunreal.com.au/code/file_gp.html
|| created: 4-Aug-03, 10:11 PM; updated: 4-Aug-03, 11:55 AM
|| size: 53959 bytes