在 .NET Core 1.1 中获取应用程序数据目录的跨平台方式
Posted
技术标签:
【中文标题】在 .NET Core 1.1 中获取应用程序数据目录的跨平台方式【英文标题】:Cross platform way to get directory for application data in .NET Core 1.1 【发布时间】:2017-03-20 21:26:52 【问题描述】:此时我正在编写一个应该能够在 Windows 和 Linux (Ubuntu 16.04) 上运行的 ASP.NET Core Web 应用程序。我有一些想要存储的数据,但是太少了,使用数据库会极大地浪费性能。更何况安装过程会是原来的两倍。
这就是我想将此信息保存在文件中的原因。在 .NET Framework 中,我会使用 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
之类的东西来获取可以存储应用程序文件的目录。 Unfortunately this method is not available in .NET Core 1.1.
有没有什么方法可以在不硬编码的情况下获取要写入的文件夹?
以下是我要写入的数据示例。此列表中的任何时候都只会有大约 5 台设备。
<devices>
<device>
<id>0</id>
<name>xxx</name>
<physicaladdress>yyyyyyyyy</physicaladdress>
</device>
...
<device>
<id>5</id>
<name>xxx</name>
<physicaladdress>yyyyyyyyy</physicaladdress>
</device>
</devices>
【问题讨论】:
App_Data
文件夹在任何平台上的 .Net Core 中都没有任何意义。
试试this
@DavidG 例如,在 Ubuntu 中,应用程序将文件保存在 /var/lib
中是很常见的。我希望有这样的目录。
为什么不使用IHostingEnvironment.ContentRootPath
中的一些相对文件夹?
/var/lib
是您系统上所有应用程序的全局存储,即使该方法将其作为值返回,它也不会与App_Data
表示相同的内容。我会说你执行#if <platform
指令会更安全。
【参考方案1】:
我通常使用来自IHostingEnvironment.ContentRootPath
的相对文件夹。它提供了一种跨平台的方式来从应用程序的根目录访问文件。如果你愿意,你甚至可以称它为App_Data
。
【讨论】:
谢谢!为了得到我的最终路径,我使用了string settingsPath = Path.Combine(_hostingEnvironment.ContentRootPath, "AppData");
如果我想在C:\Program Files
下安装一个ASP.NET Core应用程序怎么办?那么ContentRootPath
是否也会在C:\Program Files
之下的某个地方,即在没有特权访问的情况下无法写入日志文件的地方?我希望将我的日志写入 Windows 的 %APPDATA% 下的某个位置,Unix 下的 $HOME/.local/share/
等。以上是关于在 .NET Core 1.1 中获取应用程序数据目录的跨平台方式的主要内容,如果未能解决你的问题,请参考以下文章
.Net Core Middleware - 从请求中获取表单数据
.NET Core 1.1日期解析无APiSQL Server数据转换JSON
.Net Core 1.1 中 HttpUtility.JavaScriptStringEncode 的等价物在哪里?