tags:

views:

253

answers:

1

I have an XML file named PageData.xml in my App_Data folder. I want to populate an XDocument with this file using XDocument.Load.

If I supply the full physical path it works, i.e.:

XDocument vXDoc = XDocument.Load("/Work/Project/Web/100413 Dev/App_Data/PageData.xml");

...where "Work" is a folder on my C: drive.

If I try a relative path like this, though, I get a DirectoryNotFoundException:

XDocument vXDoc = XDocument.Load("AppData/PageData.xml");

"Could not find a part of the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\AppData\PageData.xml'."

This is obviously wrong, but there must be an easy way to set the correct relative path? What am I overlooking? Your help is appreciated.

+2  A: 

There's a couple of ways you can do it. You can use Server.MapPath() to turn a virtual directory into a physical directory path:

XDocument xdoc = XDocument.Load(Server.MapPath("/App_Data/PageData.xml"));

Or you can use Request.PhysicalApplicationPath as well, like so:

var path = Path.Combine(Request.PhysicalApplicationPath, "App_Data\\PageData.xml");
XDocument xdoc = XDocument.Load(path);

In either case, the problem is that the current working directory of the worker process is usually not set to the application directory (this is because working directory is a process-wide property, and a single process can host multiple web sites). More information is here.

Dean Harding
Thanks very much for your prompt response. Your first suggestion doesn't work for me "as is", but if I add a '~' to the path it works perfectly, i.e.: XDocument xdoc = XDocument.Load(Server.MapPath("~/App_Data/PageData.xml"));Many thanks for your help.
PaulC