C# 获取 %AppData% 的路径

C# getting the path of %AppData%

提问人:ant2009 提问时间:5/15/2009 最后编辑:Tot Zamant2009 更新时间:11/10/2022 访问量:431815

问:

C# 2008 SP1

我正在使用以下代码:

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

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

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

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

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

C# .NET 路径

评论


答:

987赞 Noldorin 5/15/2009 #1

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

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

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

%AppData%是一个环境变量,并且它们不会在 .NET 中的任何位置自动展开,尽管可以显式使用 Environment.ExpandEnvironmentVariable 方法执行此操作。但是,我仍然强烈建议您使用,因为正如 Johannes Rössel 在评论中指出的那样,在某些情况下可能无法设置。GetFolderPath%AppData%

最后,要创建示例中所示的路径,请执行以下操作:

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

评论

52赞 Joey 5/15/2009
+1 表示提供真正的解决方案,而不是依赖环境。补充答案:并非每个处理文件名的函数都会扩展环境变量。事实上,通常你必须显式地这样做,否则它不起作用,你最终会得到%something%文件夹。此外,环境不需要存在,在某些情况下,当在另一个用户帐户下运行程序时,用户的环境将不会被加载,%Appdata% 将为空。这就是为什么您需要使用记录的 API 来获取这些文件夹的原因(除非您使用的是批处理文件)。
0赞 Noldorin 5/15/2009
@Johannes:那里有很好的信息。我刚刚在您发布时修改了我的答案,但我会更清楚地表明 GetFolderPath 绝对比 ExpandEnvironmentVariable 更可取。
1赞 Mike Keskinov 5/22/2012
出于某种原因,为我返回空字符串(IIS 7,VS 2011)。使用Simon_Weaver解决方案解决了问题 - 使用 .Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)MapPath
73赞 roundcrisis 7/4/2012
仅供参考,为本地 AppData 提供漫游目录 Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
1赞 Palec 8/24/2021
在 Linux Docker 容器中,通常返回空字符串,因为该文件夹不存在。 创建文件夹并返回路径(例如 )。Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData, Environment.SpecialFolderOption.Create)/root/.config
7赞 danswain 5/15/2009 #2

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

尝试

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

评论

2赞 ABPerson 8/8/2020
为什么是 ?它已经给了你一个字符串......ToString
28赞 parapet 5/15/2009 #3

您还可以使用

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

以展开变量。%AppData%

评论

0赞 KargWare 11/17/2022
这个功能对我来说是新的,谢谢你提到!ExpandEnvironmentVariables
51赞 Simon_Weaver 7/27/2009 #4

如果你说的是 ASP.NET,路径就不同了。

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

相反,您需要这样做:

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

(注意:您不需要 MVC 控制器中的“Current”属性)

如果有另一种更“抽象”的方式,很想听听怎么做。App_Data

评论

0赞 George Mauer 8/11/2016
请注意 asp.net 因为核心现在出来了。此方法特别依赖于 IIS。
8赞 Simon_Weaver 9/17/2016
HostingEnvironment.MapPath(@"~/App_Data")更好,并且可以在没有 HttpContext 的 MVC/WebAPI 和 WCF 上下文中工作 - 但不确定核心'
16赞 Nathan 4/8/2010 #5

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

84赞 Bitterblue 6/14/2013 #6

使用 AppData 目录的最佳方式使用 Environment.ExpandEnvironmentVariables 方法。

原因:

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

例子:

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

评论

0赞 RBT 2/17/2017
喜欢你的变量:)的例子path
0赞 blins 3/14/2018
+1 是最好的,当您只需要扩展时,无论路径字符串中可能包含哪个环境变量。Environment.ExpandEnvironmentVariable
2赞 bizzehdee 11/14/2021
这是所问问题的实际答案。这需要更高
3赞 cpoDesign 6/28/2015 #7

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

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

评论

0赞 Derrick 4/9/2016
可能不是正确的答案,但这就是我一直在寻找的。+1
0赞 ajaysinghdav10d 2/24/2017
用双引号替换单引号后为我工作。Path.Combine(HttpRuntime.AppDomainAppPath,“App_Data”)
1赞 Bill 3/28/2018 #8

这在控制台应用程序中对我有用 -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");
1赞 MoonStom 12/12/2018 #9

对于 ASP.NET,需要在应用池上设置设置,但这还不够。有一个名为 的隐藏设置,由于某种原因,默认情况下该设置处于关闭状态,而不是像文档中所述那样打开。您可以更改默认值,也可以在应用池中设置默认值。然后,类上的所有方法都将返回正确的值。Load User ProfilesetProfileEnvironment\Windows\System32\inetsrv\Config\applicationHost.configEnvironment

15赞 Arsen Khachaturyan 11/10/2020 #10

AppData ⇝ 本地又名 ():C:\Users\<user>\AppData\Local

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

AppData ⇝ 漫游又名 ():C:\Users\<user>\AppData\Roaming

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

此外,了解以下信息可能很方便:

  • Environment.SpecialFolder.ProgramFiles- 用于程序文件 X64 文件夹
  • Environment.SpecialFolder.ProgramFilesX86- 用于程序文件 X86 文件夹

如需查看完整列表,请点击此处

1赞 willcodes 11/10/2022 #11
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);