GetCurrentDirectory() returns 部署到服务器后的本地路径

GetCurrentDirectory() returns local path after deployed on server

要求: 在我的 .Net Core 控制台应用程序中,我使用 Directory.GetParent(Directory.GetCurrentDirectory()) 来检索存储我的模板文件的当前父文件夹。

问题: 在服务器上部署后,当我通过双击手动 运行 exe 时,它​​工作正常。但是当我尝试 运行 它与批处理或任务调度程序时,上面的语句 return 通过本地计算机路径,而不是服务器上的路径。

服务器详细信息: OS:Windows 服务器 2012 R2 标准版

错误堆栈: 错误消息:找不到文档 StackTrace:在 DocumentFormat.OpenXml.Packaging.OpenXmlPackage.OpenCore(字符串路径,布尔 readWriteMode) 在 DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open(字符串路径,布尔值 isEditable,OpenSettings openSettings) 在 CV_Export.Program.SearchAndReplace(String TemplatePath, String NewDocumentPath) in C:\Siddharth\Demo Codes.Net Core Demo\CV Export with API\CV_Export\Program.cs:line 163 时间:7/21/ 2021 4:41:53 下午

当我试图通过批处理运行 exe 时产生这个错误,错误的路径是我的本地系统。

预先感谢您的帮助。

GetCurrentDirectory()
Gets the current working directory of the application.

工作目录是一个环境概念,受应用程序执行位置和方式的影响,而不是文件的逻辑位置。

您可以通过使用 App.Domain.CurrentDomain.BaseDirectory() 来避免这种情况,这将强制对这些资源的查找始终与可执行文件相关。

NOTE: In many cases it is still beneficial to use GetCurrentDirectory() as that allows your executable to be installed in a central location, but to allow different user or security contexts to access a different set of files.

如果您坚持使用 GetCurrentDirectory(),这里有一些关于如何从调用上下文进行配置的建议:

批处理文件/脚本

从批处理文件执行时,当前环境上下文将默认在适用于批处理文件夹的工作目录中运行。

所以在你的批处理中,你需要先将工作目录更改为exe所在的文件夹,如果你使用UNC路径或完整路径访问exe,则不会运行 在该目录中,相反,如果您使用 cd 命令 更改目录 首先通常会成功。

任务计划程序

  • Specifying the running directory for Scheduled Tasks using schtasks.exe
    如果您使用的是 GUI,那么您可以通过 Start In 故意设置工作文件夹:

快捷方式

  • 类似于计划任务,在快捷方式中您也可以指定工作目录:

通过使用 Directory.GetParent(App.Domain.CurrentDomain.BaseDirectory),您可以提供应用程序基目录的相对路径。

当您使用 Directory.GetCurrentDirectory() 时,您提供了您所在位置的路径 运行 应用程序,例如 C:\Windows\System32,父目录将是 C:\Windows 而不是 .net 应用程序的父目录。