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 应用程序的父目录。
要求: 在我的 .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 应用程序的父目录。