我在哪里可以将补充文件放入Windows服务中?

问题描述:

好的,情况如下。我写了一个Windows服务。测试它作为一个“控制台”应用程序已显示出有希望的结果我在哪里可以将补充文件放入Windows服务中?

不幸的是,我无法弄清楚把文件放在哪里。我有一些对应用程序至关重要的JSON数据。它在一个文件中。我不想在这方面做太多的细节,但只是知道它必须放在一个文件中,而且非常重要。这不是一个配置文件,但它肯定是需要的。

无论如何,我已将该文件添加到我的Windows服务项目。问题是,我无法弄清楚正确的代码和设置用于在安装服务时将文件放在正确的位置。

这只是我写过的第二个Windows服务,第一个(几年前)并不需要补充文件。

我在Windows 7的Visual Studio 2015中编写了服务。我将在本地的机器上在办公室测试它,但它最终会在生产计算机上运行。

请帮忙吗?关于我应该把文件放在哪里以及我应该如何在代码中引用它的任何想法?

我看到了一个网站,说我应该使用以下命令:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 

但是,这似乎并没有帮助,当我这样做:

filePath = Environment.CurrentDirectory + "\\myfile.ext" 

文件路径从来没有真正得到了在这些情况下我的强大套装。

这里的任何帮助,非常感谢。

+1

看起来这里有三个问题:(1)应该在哪里的文件走; (2)我如何让安装人员把它放在那里;和(3)我如何在代码中引用它。如果该文件是只读的,我认为将它放在与服务可执行文件相同的目录中是明智的。你如何做到这一点取决于你正在使用哪种安装技术,尽管这是一个很常见的情况,应该不难。至于在代码中访问它,你所做的一切应该工作,我认为,但没有真正需要涉及当前目录,只需构建'.BaseDirectory'的路径 –

我没有测试过这一点,但我不明白为什么它不会工作:

internal string FilePath = 
    System.IO.Path.Combine(
     System.AppDomain.CurrentDomain.BaseDi‌​rectory, 
     Settings.Default.JsonFile); 
+1

最好是执行'FilePath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,Settings.Default.JsonFile);',这样可以消除任何可能的问题, 'JsonFile'文本或'BaseDirectory'文本。 –

+0

@斯科特,谢谢,完成。 –

好的,它看起来像我得到了这个想法。我做了以下:

  1. 在我的实际“服务”项目中,我添加了我需要的文件。
  2. 在该服务的 “方案”,我做了以下:

    System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);

    ServiceBase [] ServicesToRun;

    ServicesToRun = new ServiceBase [] { new MyService() };

    ServiceBase.Run(ServicesToRun);

而这一切监控类中,我有以下几点:

internal string FilePath = Directory.GetCurrentDirectory() + "\\" + Settings.Default.JsonFile; 

然后有说我做了一些其他的调整是不相关的这个话题,但上面似乎有伎俩。

+1

该方法仍然是* bit *风险,因为如果代码中的任何内容(包括例如.NET类或第三方库中的内容)决定更改当前目录,它可能会中断。使用基础目录直接构建文件路径会更安全。 –

+0

谢谢,哈利!我一定会把这个建议。 – MJR