C#获取%AppData%的路径


387

C#2008 SP1

我正在使用以下代码:

dt.ReadXml("%AppData%\\DateLinks.xml");

但是,我遇到一个异常,该异常指向我的应用程序从以下位置运行的位置:

找不到路径“ D:\ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \%AppData%\ DateLinks.xml”的一部分。

我以为%AppData%应该找到相对路径。当我去的时候,Start|Run|%AppData%Windows资源管理器会将我带到该目录。

由于每台客户端计算机上的用户都不相同,因此无法输入完整路径。

Answers:


802

要获取AppData目录,最好使用以下GetFolderPath方法:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

using System如果不存在,则必须添加)。

%AppData%是一个环境变量,尽管您可以显式使用此Environment.ExpandEnvironmentVariable方法,但它们不会在.NET中自动扩展。但我仍然强烈建议您使用GetFolderPath,因为正如约翰内斯·罗塞尔(JohannesRössel)在评论中指出的那样,%AppData%在某些情况下可能不会设置。

最后,按照示例所示创建路径:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");

45
+1提供真正的解决方案,而不依赖于环境。要补充答案:并非每个处理文件名的函数都会扩展环境变量。实际上,通常您必须明确地执行此操作,否则它将不起作用,并且最终会出现%something%文件夹。此外,不需要存在该环境,在某些情况下,当在另一个用户帐户下运行程序时,将不会加载用户的环境,并且%Appdata%将为空。这就是为什么您要使用记录在案的API来获取那些文件夹的原因(不过,除非您正在使用批处理文件)。
乔伊

@Johannes:那里的好信息。在您发布该内容时,我只是对我的答案进行了修改,但我将更清楚地表明,GetFolderPath绝对优于ExpandEnvironmentVariable。
诺多林

为Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)+1,我已经落后了几天。
Sumit Ghosh,2010年

1
由于某种原因Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),我返回了空字符串(IIS 7,VS 2011)。使用Simon_Weaver解决方案解决的问题-使用MapPath
Mike Keskinov

52
仅供参考,为本地AppData Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)提供漫游目录
轮回危机2012年

49

如果使用的是ASP.NET,则路径不同。

我找不到指向ASP.NET的/ App_Data的任何'SpecialFolder'值。

相反,您需要这样做:

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  

(注意:您在MVC控制器中不需要'Current'属性)

如果还有另一种“抽象”的方式可以帮助您App_Data


只是一个注释,因为asp.net core现在已经问世了。此方法特别依赖IIS。
乔治·莫尔

7
HostingEnvironment.MapPath(@"~/App_Data")更好,并且可以在没有HttpContext的MVC / WebAPI和WCF上下文中使用-但不能确定核心'
Simon_Weaver

36

最佳使用AppData目录的方式,IS使用Environment.ExpandEnvironmentVariable方法。

原因:

  • 它用有效目录或其他内容替换字符串的一部分
  • 不区分大小写
  • 简单而简单
  • 这是一个标准
  • 适合处理用户输入

例子:

string path;
path = @"%AppData%\stuff";
path = @"%aPpdAtA%\HelloWorld";
path = @"%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

请记住,有些用户输入%AppData%,有些%appdata%%APpData% 不想输入:

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

如果未设置环境变量,则不是您的错(除非是IS)。我通常不告诉人们不要重新发明轮子,而是在我第一次走另一条路之后才意识到这是一个坏主意。


喜欢您的path变量示例:)
RBT

Environment.ExpandEnvironmentVariable当您只需要扩展而不管路径字符串中可能包含哪个env var时,+ 1 最好。
blins

24

您也可以使用

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

扩展%AppData%变量。


15

在.net2.0中,您可以使用变量 Application.UserAppDataPath


20
这仅是Winforms。

7

我不认为将%AppData%放在这样的字符串中会起作用。

尝试

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()

4

只是想分享另一种在我的mvc应用程序中访问“ App_Data”文件夹的方式,以防有人需要。

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")

可能不是正确的答案,但这就是我一直在寻找的东西。+1
Derrick

用双引号替换单引号后为我工作。Path.Combine(HttpRuntime.AppDomainAppPath,“ App_Data”)
ajaysinghdav10d

1

这在控制台应用程序中为我工作-

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

对于ASP.NET,Load User Profile需要在应用程序池上进行设置,但这还不够。有一个名为setProfileEnvironmentin 的隐藏设置\Windows\System32\inetsrv\Config\applicationHost.config,由于某种原因,该设置默认情况下处于关闭状态,而不是按文档中的说明进行设置。您可以更改默认值,也可以在应用程序池中进行设置。Environment然后,该类上的所有方法将返回正确的值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.