我有一个用C#编写的控制台应用程序,它由Windows任务计划程序按计划时间启动。
该应用程序需要从其自己的目录中获取一些物理文件,并使用System.IO.Directory.GetCurrentDirectory()
进行此操作。
当我手动启动控制台应用程序时,它可以完美运行。但是当它被Windows任务计划程序启动时,它返回C:\Windows\System32
。
为什么不是应用程序目录,是否有其他方法可以获得应用程序目录?
我有一个用C#编写的控制台应用程序,它由Windows任务计划程序按计划时间启动。
该应用程序需要从其自己的目录中获取一些物理文件,并使用System.IO.Directory.GetCurrentDirectory()
进行此操作。
当我手动启动控制台应用程序时,它可以完美运行。但是当它被Windows任务计划程序启动时,它返回C:\Windows\System32
。
为什么不是应用程序目录,是否有其他方法可以获得应用程序目录?
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
System.IO.Directory.GetCurrentDirectory()
会返回执行进程的当前目录,而这个执行进程不是你的应用程序。上述代码将足以获取可执行文件所在的执行目录。
GetCurrentDirectory
返回当前目录是因为当调度程序默认启动一个应用程序时,该目录是活动目录。如果想知道二进制文件所在的目录,可以使用
Assembly.GetExecutingAssembly().Location
我还想知道你的计划任务中是否设置了“启动目录” - 设置它应该也会在应用程序启动时设置当前目录。
虽然这是一个旧的线程,但是对于一些人来说,在设置任务时,你可以通过将可选项“启动位置”值设置为你的exe文件夹来在任务的操作中分配位置。然后GetCurrentDirectory就能很好地工作了。
Assembly.GetExecutingAssembly().Location
还可以参考GetCallingAssembly()
和GetEntryAssembly()
。
我使用My.Application.Info.DirectoryPath
来指向Windows任务计划程序中所需的正确目录。
System.IO.Path.GetDirectoryName(Application.ExecutablePath)