以编程方式更改当前目录

3

在Windows系统中,使用chdir()函数在32位程序中改变目录,但是当程序退出时目录不会被改变。在16位的Windows程序中可以改变目录。有人知道如何在32位的Windows程序中实现吗?


1
使这个问题更好的需要准备的事项:您提到的是哪种编程语言?Perl?C语言?还是其他什么?其次,如果您有一些代码来演示您的问题,那将大大增加获得好回答的机会。 - JasCav
我可以问一下您为什么要这样做吗?也许有其他方法可以实现您的目标,而无需更改Windows shell的工作目录? - Andreas Rejbrand
4个回答

7

嗯……在我看来,这正是操作系统必须保证不会发生的事情之一。当前目录是一个每个进程特有的属性,子进程通常从父进程继承它,但反过来不应该发生(也确实没有发生)。

要获得您想要的结果,父进程可以主动监视某些信息(消息、文件、共享内存等),其中子进程存储新目录,然后使用新值调用chdir()。

据我所知,Windows的cmd.exe没有类似的机制。 实际上,通过在父进程上使用代码注入技术(例如CreateRemoteThread),可能会强制其执行一些意外操作,但这是一种非常肮脏的技巧,既不好用也不普遍。 Win16则是不同的:所有程序都有一个单独的“msdos”状态,但这是一个限制,而不是一个特性。


补充一点:chdir 系统调用会改变 调用 进程的目录。这意味着按设计,您无法更改其他进程的目录。 - Avindra Goolcharan

3
看起来你是在询问一个进程(你的Win32程序)如何改变另一个进程(你的shell)的CWD。据我所知,除非后者提供了一个API用于此目的,否则这是不可能的。然而,我能找到的与此主张最接近的参考资料是下面这段MSDN引用:
“父进程可以在进程创建期间直接改变子进程的环境变量。这是唯一一种情况,其中一个进程可以直接改变另一个进程的环境设置。”

2

没错,流行的API调用可以改变进程的目录。但是……

(1.) 16位Windows程序可以更改全局目录;可能是因为它们在与command.com相同的进程中运行。这是我多年来一直使用的方法;我假设XP以某种方式模拟了这一点?……但现在Windows 7 64位不再运行16位程序了!(?)

(2.) Windows和Unix的“cd”命令都可以更改调用进程的目录——这可能是因为它们是命令外壳的内置命令。但是后继的Windows shell也能够完成这个任务,或者至少我希望PowerShell能够做到这一点。所有的内置命令吗?

(3.) 我最终采用的方法是修改我的程序,使其不再调用API,而是向标准输出发出“cd \dst\directory”,然后在一个过程中执行:

chdirprogram >t~.bat

call T~.bat

这非常好用。当然,更改目录程序的常见目的是在批处理程序中提供具有计算目标的功能。在Unix中,您可以使用Bash等变量来实现,但在Windows批处理文件中却不能,虽然在许多后继的Windows过程中可能可以,但我不想使用它们。……由于这个功能显然非常有用,我希望有人知道一个偷偷摸摸的Windows调用可以实现它。说进程更改调用进程的目录是错误的解释只是那些虚假的“你不应该这样做,我不会告诉你为什么”的借口。……但我想我还是要坚持使用我的可怜的小批处理文件。


0
你是在谈论 Windows API 的 SetCurrentDirectory 函数吗?文章中说这个函数“改变当前进程的当前目录”。例如,在 Delphi 中,有一个名为 ChDir 的函数实际上调用了这个 API 函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接