如何在.config文件中相对于文件指定路径?

12

我使用的应用程序解释一个 .NET .config 文件。我添加了一行指定它需要的证书路径。

<add key="Certificate" value="..\certificate.abc"/>

然而,我发现该应用程序仅在从其.exe.config所在的确切文件夹运行时才起作用。如果从另一个文件夹运行,它将失败,因为它会在../处寻找证书,相对于工作目录展开。

我应该在配置文件中写什么,以确保路径是..\certificate.abc相对于配置文件而不是工作目录进行展开?

我无法更改应用程序(不是我的),我只能更改配置文件。


2
如果这只是一个你添加的键,那么在读取键值后,你可以在代码中执行该操作。 - George Duckett
7个回答

11

通过使用波浪符号

value="~/certificate.abc"

1
你从哪里学到了波浪符号?我找不到相关的文档。 - Colonel Panic
@ColonelPanic ~ 表示 *nix 操作系统中的主文件夹。实际上,这并没有得到适当的记录。 - Tarik

3
在Visual Studio 2015中,“~”关键字已不再起作用。 现在,您可以使用以下内容:
value="folder\subfoler"

"

文件夹"与.exe文件处于相同级别。

"

我们如何引用父目录中的位置呢? - Guett31

1

如果你只是改变配置文件,是无法改变这个的。除非你使用绝对路径。

如果你可以改变应用程序...

如果这是一个asp.net应用程序,那么请使用Server.MapPath。如果这是一个Windows应用程序,则需要获取执行应用程序的目录,并将其与配置文件中的相对路径组合。

System.Reflection.Assembly.GetExecutingAssembly().Location将为您提供.EXE文件的路径。然后,您可以调用Path.Combine将相对路径与应用程序的路径组合。


1

..\ 表示返回上一级目录。需要多次使用时,可以重复使用,例如 ..\..\ 可以返回到您的 bin 文件夹。


0

我认为在您的情况下,您需要设置文件名。您知道所有文件所在的文件夹(如果文件夹可以更改-请设置没有../的文件夹)

在需要使用路径的地方-结合应用程序的当前位置(可以在运行时获取)和设置密钥

或者使用

System.Web.HttpContext.Current.Server.MapPath("~/[PARTH_TO_FILE]") '

1
你不需要通过编辑你的答案来复制别人的答案。 - SpaceApple

0

你的配置文件可能位于执行文件的其他位置。由于你提到了执行路径,我理解这是一个基于桌面的应用程序,所以你可以像这样做。

在配置文件中。

 <setting name="FilePath" serializeAs="String">
        <value>AppPath\MyFile.abc</value>
    </setting>

并检索此内容。

   var path = System.Configuration.ConfigurationManager.AppSettings["FilePath"];

            if  (path !=null && path.Contains("AppPath"))
            {

                var filepath = System.IO.Path.Combine(
                    System.Reflection.Assembly.GetExecutingAssembly().Location,
                    path.Replace("AppPath", string.Empty).ToString());

                Console.WriteLine(filepath);
            }

0
如果您正在使用以下代码
请在您想要放置日志的文件路径前使用"../"
错误日志文件夹将会被创建在bin\Debug\net5.0目录下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接