关于.net:C#获取%AppData%的路径

C# getting the path of %AppData%

C(2008)SP1

我使用下面的代码:

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

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

Could not find a part of the path
'D:\Projects\SubVersionProjects\CatDialer\bin\Debug\%AppData%\DateLinks.xml'.

我认为江户十一号〔0〕应该找到相对的路径。当我访问Start|Run|%AppData%时,Windows资源管理器会把我带到那个目录。

我不能输入完整的路径,因为每个客户机上的用户是不同的。


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

1
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

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

%AppData%是一个环境变量,在.NET中不会自动扩展到任何地方,尽管您可以显式地使用Environment.ExpandEnvironmentVariable方法进行扩展。不过,我还是强烈建议您使用GetFolderPath,因为作为johannes r?SSEL在评论中指出,%AppData%在某些情况下可能不会设定。

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

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


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

我找不到任何指向ASP.NET的/app_数据的"specialfolder"值。

相反,您需要这样做:

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

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

如果有另一种更"抽象"的方法到达App_Data,我很想听听。


使用appdata目录的最佳方法是使用Environment.ExpandEnvironmentVariable方法。

原因:

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

实例:

1
2
3
4
5
6
7
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%。你不想以:

1
2
3
4
if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

如果未设置环境变量,则不是您的错误(此外,如果设置了环境变量)。我通常不告诉人们不要重新发明轮子,但在我第一次走到另一个方向并意识到这是一个坏主意之后。


您也可以使用

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

扩展%AppData%变量。


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


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

尝试

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


我只想在我的MVC应用程序中共享另一种访问"app_data"文件夹的方式,以防有人需要。

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


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


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

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