在 .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 &lt;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 的等价物在哪里?

如何在 ASP.NET Core 5 MVC (.NET 5) 中获取记录的用户数据?

Asp.Net Core 1.1 消费web api

.Net Core 1.1 中的传递引用