C#获取%AppData%路径

482

C# 2008 SP1

我正在使用以下代码:

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

然而,我收到了一个异常,指向我的应用程序所在的位置:

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

我以为 %AppData% 应该能找到相对路径。当我执行 开始|运行|%AppData% 时,Windows资源管理器会带我到那个目录。

我不能使用完整路径,因为每个客户端机器上的用户都不同。

11个回答

988

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

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

如果没有添加using System,则必须添加。

%AppData%是一个环境变量,在.NET中它们不会自动扩展,但您可以显式使用Environment.ExpandEnvironmentVariable方法来进行扩展。然而,我仍然强烈建议您使用GetFolderPath,因为正如Johannes Rössel在评论中指出的那样,%AppData%在某些情况下可能未被设置。

最后,要创建您示例中显示的路径:

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

52
对于提供真正解决方案而非依赖环境的做法我给一个加1。此外,需要补充的是,并不是处理文件名的每个函数都会展开环境变量。通常情况下,你必须明确指定才能展开环境变量,否则它将无法工作,你最终得到的是%某些东西%文件夹。此外,并非必须存在环境变量,在某些情况下,在其他用户帐户下运行程序时,用户的环境将不会被加载,%Appdata% 将为空。这就是为什么你会想要使用文档化的 API 来获取这些文件夹(除非你正在使用批处理文件)。 - Joey
+1 对于 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),我已经在这个问题上困扰了好几天了。 - Sumit Ghosh
1
由于某种原因,Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 在我的情况下返回空字符串(IIS 7,VS 2011)。通过使用Simon_Weaver的解决方案 - 使用MapPath进行映射,问题得到了解决。 - Mike Keskinov
73
FYI,这提供了本地AppData漫游目录。Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) - roundcrisis
1
在Linux Docker容器中,Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)通常返回空字符串,因为该文件夹不存在。Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData, Environment.SpecialFolderOption.Create)会创建该文件夹并返回路径(例如/root/.config)。 - Palec
显示剩余2条评论

84

使用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

喜欢你的path变量示例 :) - RBT
+1 Environment.ExpandEnvironmentVariable 是最好的选择,无论路径字符串中包含哪些环境变量,它都可以简单地进行扩展。 - blins
2
这是实际的答案,回答了所提出的问题。这需要更高地呈现。 - bizzehdee

51

如果你在谈论ASP.NET,那么路径是不同的。

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

相反,您需要执行以下操作:

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

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

如果有另一种更加“抽象”的方法可以访问App_Data,我很乐意听听您的想法。


只是一个提醒,因为asp.net core现在已经推出。这种方法特别依赖于IIS。 - George Mauer
8
"HostingEnvironment.MapPath(@"~/App_Data")" 更好,并且适用于没有 HttpContext 的 MVC / WebAPI 和 WCF 上下文,但不确定是否适用于 Core。 - Simon_Weaver

28

你也可以使用

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

扩展%AppData%变量。


ExpandEnvironmentVariables 函数对我来说是新的,谢谢提及! - KargWare

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

15

AppData ⇝ Local 即 (C:\Users\<user>\AppData\Local):

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

应用数据 ⇝ 漫游,也称 (C:\Users\<user>\AppData\Roaming):

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

此外,了解以下内容可能会很方便:

  • Environment.SpecialFolder.ProgramFiles - 用于Program files X64文件夹
  • Environment.SpecialFolder.ProgramFilesX86 - 用于Program files X86文件夹

要查看完整列表,请单击此处


7
我认为像这样在字符串中放置%AppData%是行不通的。 尝试:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()

2
为什么要使用 ToString?它已经给你一个字符串了... - ABPerson

3

如果有人需要,我想分享一种访问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
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接