Getting the Application Root Path in ColdFusion

by Pete Freitag

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.

The Fixinator Code Security Scanner for ColdFusion & CFML is an easy to use security tool that every CF developer can use. It can also easily integrate into CI for automatic scanning on every commit.

Comments

Raymond Camden

Send to cflib?

Boyan

Awesome! Thanks! Where were you a few months ago when I really needed one of these?! Just kidding, thanks for sharing.

Rob Munn

Pete, nifty little function, thanks, it just saved me some time.

Chris

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)

James Moberg

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>