Linux系统下使用代码创建并使系统服务程序读取主目录下的配置文件

场景:

在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”表示此配置文件可选,在文件不存在或没有找到的情况下,不加载此文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值