默认/相对路径解析如何在.NET中工作?

所以…我曾经认为,当你访问一个文件但指定了没有路径的名称(在我的情况下是CAISLog.csv)时,.NET会希望文件驻留在与正在运行的.exe相同的路径上。

当我逐步完成解决方案(C#.NET2。* VS2K5)但我在正常模式下运行应用程序(由Websphere MQ触发器监视器启动并在后台作为网络服务运行)而不是访问文件时在.exe是在C:\ WINDOWS \ system32中查找的路径。 如果它重要父任务的.exe与我的应用程序几乎在同一文件夹结构/路径中

我收到一个匹配的错误:“ System.UnauthorizedAccessException:拒绝访问路径’C:\ WINDOWS \ system32 \ CAISLog.csv’。

我的解决方法是完全限定我的文件的位置。 然而,我想要理解的是“在IO期间仅指定文件名时,管理路径如何解析的.NET规则什么?” 我觉得我错过了一些基本的概念,这让我很烦。

编辑 – 我不确定它本身是一个.NET规则,但Schmuli似乎更清楚地解释了这个概念。 我一定会在将来尝试Rob Prouse的建议,所以+1也是如此。

如果有人有一些重写措辞的建议,强调我并不真正关心找到我的.exe的路径 – 而只是不明白相关路径解决方案发生了什么(我可能仍然把我的终端文件搞砸了) …

当应用程序(WinForms)启动时, Environment.CurrentDirectory包含应用程序文件夹的路径(即包含.exe程序集的文件夹)。 使用任何文件对话框,例如 OpenFileDialogSaveFileDialog等将导致当前目录发生更改(如果选择了不同的文件夹)。

运行Windows服务时,其包含的文件夹是C:\ Windows \ System32,因为它是System文件夹,它是实际运行Windows服务的系统(即操作系统)。

请注意,在大多数System.IO对象中指定相对路径将回退到使用Environment.CurrentDirectory属性。

如上所述,有几种方法可以使用Assembly.GetEntryAssembly()Assembly.GetExecutingAssembly()然后使用Location属性或CodeBase属性来获取服务可执行文件的路径(请注意,这是文件路径,而不是目录,可执行文件)。

另一种选择是使用:

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

在Service的OnStart方法中进行调用,将其应用于整个应用程序。

它基于当前工作目录,该目录可能与应用程序所在的位置相同或不同,尤其是从其他程序或具有不同工作目录的快捷方式启动时。

而不是硬编码路径,获取程序的路径并使用它。 你可以用这样的东西做到这一点

 Assembly ass = Assembly.GetEntryAssembly(); string dir = Path.GetDirectoryName(ass.Location); string filename = Path.Combine( dir, "CAISLog.csv" ); 

这假定条目程序集是您的文件所在的位置。 如果没有,你可以改变组装方式;

 Assembly ass = Assembly.GetAssembly( typeof( AClassInYourAssembly ) ); 

相对路径解析从不对启动可执行文件的路径起作用。 它总是对进程’当前目录有效,你真的不希望总是设置到.exe所在的目录。

如果您需要这种行为,那么请注意自己找出正确的路径,并提供文件操作的完全限定路径。

您可以使用它来指定驻留在exe @“.. \ CAISLog.csv”的相同路径上的路径。 请注意,双点指的是.exe所在位置的父目录。

RWendi