WINDOWS系统快捷方式的“起始位置”属性指出了进程的最初的“当前目录”。当前或工作目录的概念在我所使用的各种操作系统下是相通的:进程的当前目录,即用于一定操作的默认文件系统目录(比如在AUTOCAD中打开一张图纸)。当Windows系统试图确认要加载的DLL文件位置时,也会用到它。 当启动一个进程时,可能需要指定进程的当前目录:通常的做法是在命令行窗体下修改快捷方式中的“起始位置”项,以改变 当前目录(使用CHDIR或CD),并从此处启动可执行文件,或在Visual Studio调试器下指定此程序的工作目录。并且当进程运行后,当前目录也是可以更改的。 AutoCAD 2008的默认“起始位置”为"C:\Program Files\Autodesk\AutoCAD 2008\UserDataCache\"。为了查看在程序中查询“起始位置”的过程,我对这个快捷方式进行了复制,并把“起始位置”修改成了"c:\temp":
下面是我知道的两种查询此特性的方法: System.Environment.CurrentDirectory System.IO.Directory.GetCurrentDirectory() 我创建了一个命令,CURDIR,用来查询此特性并打印出此查询结果:
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- namespace CurrentDirectory
- {
- public class Commands
- {
- [CommandMethod("CURDIR")]
- public void GetCurrentDirectory()
- {
- Document doc =
- Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- ed.WriteMessage(
- "\nSystem.Environment.CurrentDirectory: "
- + System.Environment.CurrentDirectory
- + "\nSystem.IO.Directory.GetCurrentDirectory(): "
- + System.IO.Directory.GetCurrentDirectory()
- );
- }
- }
- }
复制代码上面的代码能很好的运行,但它并不能返回我们所想要的结果:命令执行时,模块是如何加载的。如果我们使用“命令加载”来加载模块,模块运行足够早的话,通常情况下会返回我们期望的结果。 下面是在修改过快捷方式的AutoCAD 实例中,执行CURDIR命令加载我们的模块时所返回的结果: Command: curdir
System.Environment.CurrentDirectory: C:\temp System.IO.Directory.GetCurrentDirectory(): C:\temp 另一方面,如果我们使用NETLOAD命令来加载我们的模块,就可以得到所加载模块的目录: Command: netload
Command: curdir
System.Environment.CurrentDirectory: C:\Program Files\Autodesk\ObjectARX 2008\samples\dotNet\Prompts\bin\Debug System.IO.Directory.GetCurrentDirectory(): C:\Program Files\Autodesk\ObjectARX 2008\samples\dotNet\Prompts\bin\Debug 这花费我了不少时间来思考所发生的问题: AutoCAD中标准的“文件导航”对话框,不管是在打开一张图纸文件,加载一个应用,还是对另一种类型的文件执行一种操作时-打开的当前目录为其最近操作的目录,即第一次运行和关闭时的文档位置。所以即使你没有执行过“打开”命令,你所浏览过的目录(不包括进行取消操作的目录)也会成为新的当前目录。 不管这个结果是否直观或者是在预料之中的,这都不是我真正想说的(尽管我理解为什么大家会对此有意见)。这篇文章的真正寓意是获取的AutoCAD(或实际中的其他复杂应用 )的“起始位置”并不是十分可靠,除非在执行过程中及早进行获取。因为进程中的代码在需要时就会对设置进行修改。 尽管不是100% 可靠 – 并不能确保一些别的代码并没有提前对此特性进行了修改- 确认“起始位置”的最好时机是在AutoCAD启动并加载一个模块时。
|