I wrote a handy function today that will return the server file system path of the acting Application.cfm
file for a ColdFusion application. It works by working its way up the directory tree until it finds an Application.cfm
file. If it doesn't find one it will throw an exception.
<cffunction name="getApplicationRootPath" returntype="string" hint="Returns the root path of the acting Application.cfm file." output="false" access="public"> <cfargument name="base_path" default="./" hint="Normally you want to leave this as default" required="false"> <cfset var actual_path = ExpandPath(arguments.base_path)> <cfif FileExists(ExpandPath(arguments.base_path & "Application.cfm"))> <cfreturn actual_path> <cfelseif REFind(".*[/\\].*[/\\].*", actual_path)> <cfreturn getApplicationRootPath("../#arguments.base_path#")> <cfelse> <!--- we have reached the root dir, so throw an error not found ---> <cfthrow message="Unable to determine Application Root Path" detail="#actual_path#"> </cfif> </cffunction>
It probably could be optimized a bit more, but it does the trick for me.
Comments
Send to cflib?
Awesome! Thanks! Where were you a few months ago when I really needed one of these?! Just kidding, thanks for sharing.
Pete, nifty little function, thanks, it just saved me some time.
alternately you could put this in the application file itself <cfset request.appPath = GetCurrentTemplatePath()> That will give you a request var with the same info in it (server path to the application)
I know this is an old post, but I modified the script so that I could add it to the CustomTag directory and identify a shared IIS virtual directory on my server that exists outside of the application root. The technique for going down a sub-directory (../) wasn't working as I was using a full path. I used the "ListReverse" UDF to safely identify and drop the current sub-directory. http://cflib.org/udf/ListReverse Here's the code: <cffunction name="getScriptsGlobalRootPath" returntype="string" hint="Returns the root path of the shared virtual script directory." output="false" access="public"> <cfargument name="base_path" default="#GetDirectoryFromPath(getBaseTemplatePath())#" hint="Normally you want to leave this as default" required="false"> <cfset var actual_path = arguments.base_path> <cfif DirectoryExists(arguments.base_path & "_globalScripts")> <cfreturn actual_path & "_globalScripts"> <cfelseif listlen(actual_path,":") GT 1> <CFSET arguments.base_path = Request.ListReverse(ListRest(Request.ListReverse(arguments.base_path, "\"),"\"),"\") & "\"> <cfreturn getScriptsGlobalRootPath(arguments.base_path)> <cfelse> <!--- we have reached the root dir, so throw an error not found ---> <cfthrow message="Unable to determine the shared virtual script directory" detail="#actual_path#"> </cfif> </cffunction>