场景:
在Linux下,将JSON数据保存到一个静态文件中,而这个文件位于多级目录下,并且该目录可能并不存在,不存在得情况下需要创建多级目录,并生成该静态文件。而在Linux下创建目录是需要权限的,因此,目录应该选择在主目录下,只有主目录下是不需要权限的,而多数软件也是如此操作的。
环境:
Linux
.Net8
方案
比如,此文件目录为
/主目录/.zhaoming6/zhaoming-gateway/serial.json
但是,当前我们并不知道主目录是什么,因为不同的系统,主目录都不一样。
获取主目录:
var home = Environment.GetEnvironmentVariable("HOME");
而“home”就是主目录,
/home/zg
文件目录为
var path = $"{home}/.zhaoming6/zhaoming-gateway/serial.json";
创建文件:
private async void GenerateTheConfigFile(string path)
{
using var process = new Process();
process.StartInfo = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = $"-c \"touch {path}\"",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
process.Start();
var output = await process.StandardOutput.ReadToEndAsync();
await process.WaitForExitAsync();
}
而读取文件时,可能程序不同,使用的权限不同,那么得到的主目录是不一样的,使用主用户得到的主目录应该是例如“/home/zg”,而系统服务程序使用root权限得到的是“/home/root”,因此:
private static string GetConfigFilePath()
{
try
{
using var process = new Process();
process.StartInfo = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = $"-c \" id -nu 1000\"",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
process.Start();
var user = process.StandardOutput.ReadToEnd();
process.WaitForExit();
if (user.Contains('\n'))
{
user = user[..^1];
}
var home = Environment.GetEnvironmentVariable("HOME");
var first = home.Split("/")[1];
return $"/{first}/{user}/.zhaoming6/zhaoming6-fas-gateway/serialport.json";
}
catch
{
return "";
}
}
加载配置文件:
var config = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appsettings.json")
.AddJsonFile(GetConfigFilePath(), true)
.Build();
后面的配置文件会覆盖前面的相同的配置数据,而参数“true”表示此配置文件可选,在文件不存在或没有找到的情况下,不加载此文件。