C#获取%AppData%的路径

ant*_*009 367 .net c# path

C#2008 SP1

我使用下面的代码:

dt.ReadXml("%AppData%\\DateLinks.xml");
Run Code Online (Sandbox Code Playgroud)

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

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

我认为%AppData%应该找到相对的路径.当我去Start|Run|%AppData%Windows浏览器带我到那个目录.

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

Nol*_*rin 764

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

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Run Code Online (Sandbox Code Playgroud)

using System是一个环境变量,它们不会在.NET中的任何位置自动扩展,尽管您可以明确地使用该%AppData%方法来执行此操作.我仍然强烈建议您使用,Environment.ExpandEnvironmentVariable但正如JohannesRössel在评论中指出的那样,GetFolderPath在某些情况下可能不会设置.

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

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");
Run Code Online (Sandbox Code Playgroud)

  • FYI为本地AppData Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)提供漫游目录 (48认同)
  • +1提供真正的解决方案,而不是依赖于环境.添加答案:并非每个处理文件名的函数都会扩展环境变量.事实上,通常你必须明确地这样做,否则它不起作用,你最终会得到%something%文件夹.此外,不需要存在环境,在某些情况下,当在另一个用户帐户下运行程序时,将不会加载用户的环境并且%Appdata%将为空.这就是为什么你想要使用文档化的API来获取这些文件夹(除非你使用的是批处理文件). (42认同)
  • 在 Linux Docker 容器中,“Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)”通常返回空字符串,因为该文件夹不存在。`Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData, Environment.SpecialFolderOption.Create)` 创建文件夹并返回路径(例如 `/root/.config`)。 (2认同)

Sim*_*ver 48

如果您正在谈论ASP.NET,那么路径就不同了.

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

相反,你需要这样做:

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  
Run Code Online (Sandbox Code Playgroud)

(注意:您不需要MVC控制器中的"当前"属性)

如果还有另一种更"抽象"的方式,App_Data就会喜欢听.

  • `HostingEnvironment.MapPath(@"〜/ App_Data")`更好,适用于没有HttpContext的MVC/WebAPI和WCF上下文 - 但不确定核心' (7认同)

Bit*_*lue 31

最佳使用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);
Run Code Online (Sandbox Code Playgroud)

记住一些用户输入%AppData%,一些%appdata%和一些%APpData% 你不想最终:

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation
Run Code Online (Sandbox Code Playgroud)

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

  • 这是所提出问题的实际答案。这个需要更高 (2认同)

par*_*pet 22

你也可以使用

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");
Run Code Online (Sandbox Code Playgroud)

扩展%AppData%变量.


Nat*_*han 15

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

  • 这只是Winforms. (20认同)

Ars*_*yan 7

应用程序数据 ?本地别名 ( C:\Users\<user>\AppData\Local):

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Run Code Online (Sandbox Code Playgroud)

应用程序数据 ?漫游又名 ( C:\Users\<user>\AppData\Roaming):

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Run Code Online (Sandbox Code Playgroud)

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

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

有关完整列表,请查看此处


dan*_*ain 6

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

尝试

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
Run Code Online (Sandbox Code Playgroud)

  • 为什么是“ToString”?它已经给了你一个字符串...... (2认同)