C# 2008 SP1
I am using the code below:
dt.ReadXml("%AppData%\\DateLinks.xml");
However, I am getting an exception that points to the location of where my application is running from:
Could not find a part of the path 'D:\Projects\SubVersionProjects\CatDialer\bin\Debug\%AppData%\DateLinks.xml'.
I thought the %AppData%
should find the relative path. When I go Start|Run|%AppData%
windows explorer takes me to that directory.
I can not put the full path in, as the user is different on each client machine.
To get the AppData directory, it's best to use the GetFolderPath
method:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
(must add using System
if not present).
%AppData%
is an environment variable, and they are not automatically expanded anywhere in .NET, although you can explicitly use the Environment.ExpandEnvironmentVariable
method to do so. I would still strongly suggest that you use GetFolderPath
however, because as Johannes Rössel points out in the comment, %AppData%
may not be set in certain circumstances.
Finally, to create the path as shown in your example:
var fileName = Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.ApplicationData), "DateLinks.xml");
The BEST way to use the AppData directory, IS to use Environment.ExpandEnvironmentVariables
method.
Reasons:
it replaces parts of your string with valid directories or whatever
it is case-insensitive
it is easy and uncomplicated
it is a standard
good for dealing with user input
Examples:
string path;
path = @"%AppData%\stuff";
path = @"%aPpdAtA%\HelloWorld";
path = @"%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths
path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);
%ALLUSERSPROFILE% C:\ProgramData
%APPDATA% C:\Users\Username\AppData\Roaming
%COMMONPROGRAMFILES% C:\Program Files\Common Files
%COMMONPROGRAMFILES(x86)% C:\Program Files (x86)\Common Files
%COMSPEC% C:\Windows\System32\cmd.exe
%HOMEDRIVE% C:
%HOMEPATH% C:\Users\Username
%LOCALAPPDATA% C:\Users\Username\AppData\Local
%PROGRAMDATA% C:\ProgramData
%PROGRAMFILES% C:\Program Files
%PROGRAMFILES(X86)% C:\Program Files (x86) (only in 64-bit version)
%PUBLIC% C:\Users\Public
%SystemDrive% C:
%SystemRoot% C:\Windows
%TEMP% and %TMP% C:\Users\Username\AppData\Local\Temp
%USERPROFILE% C:\Users\Username
%WINDIR% C:\Windows
path
variable :)
Environment.ExpandEnvironmentVariable
is best when you simply need to expand regardless of which env vars might be in the path string.
The path is different if you're talking ASP.NET.
I couldn't find any of the 'SpecialFolder' values that pointed to /App_Data for ASP.NET.
Instead you need to do this:
HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")
(Note: You don't need the 'Current' property in an MVC Controller)
If theres another more 'abstract' way to get to App_Data
would love to hear how.
HostingEnvironment.MapPath(@"~/App_Data")
is better and works in both MVC / WebAPI and WCF contexts where there is no HttpContext - but not sure about core'
You can also use
Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");
to expand the %AppData%
variable.
In .net2.0 you can use the variable Application.UserAppDataPath
AppData ⇝ Local aka (C:\Users\<user>\AppData\Local
):
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
AppData ⇝ Roaming aka (C:\Users\<user>\AppData\Roaming
):
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Additionally, it could be handy to know:
Environment.SpecialFolder.ProgramFiles - for Program files X64 folder
Environment.SpecialFolder.ProgramFilesX86 - for Program files X86 folder
For the full list check here.
I don't think putting %AppData% in a string like that will work.
try
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
ToString
? It's already giving you a string...
Just wanted to share another way of accessing 'App_Data' folder in my mvc application in case that someone needs this.
Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")
This is working for me in a console application -
string appData = System.Environment.GetEnvironmentVariable("APPDATA");
For ASP.NET, the Load User Profile
setting needs to be set on the app pool but that's not enough. There is a hidden setting named setProfileEnvironment
in \Windows\System32\inetsrv\Config\applicationHost.config
, which for some reason is turned off by default, instead of on as described in the documentation. You can either change the default or set it on your app pool. All the methods on the Environment
class will then return proper values.
Success story sharing
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
returns empty string for me (IIS 7, VS 2011). Problem solved using Simon_Weaver solution - mapping usingMapPath
.