【问题标题】:C# getting the path of %AppData%C# 获取 %AppData% 的路径
【发布时间】:2010-10-26 10:23:01
【问题描述】:

C# 2008 SP1

我正在使用下面的代码:

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

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

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

我认为%AppData% 应该找到相对路径。当我去Start|Run|%AppData%时,windows explorer 会把我带到那个目录。

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

【问题讨论】:

    标签: c# .net path


    【解决方案1】:

    要获取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");
    

    【讨论】:

    • +1 用于提供真正的解决方案,而不依赖于环境。添加到答案:并非每个处理文件名的函数都会扩展环境变量。事实上,通常你必须明确地这样做,否则它不起作用,你最终会得到 %something% 文件夹。此外,环境不需要存在,在某些情况下,当在另一个用户帐户下运行程序时,不会加载用户的环境并且 %Appdata% 将为空。这就是为什么您需要使用文档化 API 来获取这些文件夹的原因(除非您使用的是批处理文件)。
    • @Johannes:那里有很好的信息。我刚刚修改了您发布的答案,但我会更清楚地说明 GetFolderPath 绝对比 ExpandEnvironmentVariable 更可取。
    • Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +1,我已经落后了几天了。
    • 出于某种原因 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 为我返回空字符串(IIS 7,VS 2011)。使用 Simon_Weaver 解决方案解决的问题 - 使用 MapPath 映射。
    • 仅供参考,为本地 AppData Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) 提供漫游目录
    【解决方案2】:

    我认为将 %AppData% 放在这样的字符串中是行不通的。

    试试

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

    【讨论】:

    • 为什么是ToString?它已经给了你一个字符串......
    【解决方案3】:

    你也可以使用

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

    扩展%AppData% 变量。

    【讨论】:

      【解决方案4】:

      如果您使用的是 ASP.NET,路径会有所不同。

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

      相反,您需要这样做:

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

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

      如果有另一种更“抽象”的方式可以到达App_Data,我很想听听如何。

      【讨论】:

      • 请注意,因为 asp.net core 即将问世。这种方法特别依赖于 IIS。
      • HostingEnvironment.MapPath(@"~/App_Data") 更好,可以在没有 HttpContext 的 MVC / WebAPI 和 WCF 上下文中工作 - 但不确定核心'
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        BEST 使用 AppData 目录的方式,IS 使用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);
        

        More info:

        %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 变量示例 :)
        • +1 Environment.ExpandEnvironmentVariable 最适合您只需要扩展而不管路径字符串中可能包含哪些环境变量。
        • 这是对所问问题的实际答案。这需要更高
        【解决方案7】:

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

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

        【讨论】:

        • 可能不是正确的答案,但这是我正在寻找的。 +1
        • 用双引号替换单引号后为我工作。 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")
        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          对于 ASP.NET,需要在应用程序池上设置 Load User Profile 设置,但这还不够。在\Windows\System32\inetsrv\Config\applicationHost.config 中有一个名为setProfileEnvironment 的隐藏设置,由于某种原因默认关闭,而不是documentation 中描述的打开。您可以更改默认设置或在您的应用程序池中设置它。 Environment 类的所有方法都将返回正确的值。

          【讨论】:

            【解决方案10】:

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

            Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
            

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

            Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
            

            另外,了解一下可能会很方便:

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

            完整列表请查看here

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-25
              • 1970-01-01
              • 1970-01-01
              • 2022-12-12
              • 1970-01-01
              相关资源
              最近更新 更多