Why does each drive have its own current directory?
Commenter Dean Earley asks, “Why is there a ‘current directory’ AND an current drive? Why not merge them?”
Pithy answer: Originally, each drive had its own current directory, but now they don’t, but it looks like they do.
Okay, let’s unwrap that sentence. You actually know enough to answer the question yourself; you just have to put the pieces together.
Set the wayback machine to DOS 1.0. Each volume was represented by a drive letter. There were no subdirectories. This behavior was carried forward from CP/M.
Programs from the DOS 1.0 era
didn’t understand subdirectories;
they referred to files by just drive letter and file name,
Let’s fire up the assembler
(compilers were for rich people)
and assemble a program whose source code is on the A drive,
but sending the output to the B drive.
||the “.asm” extension on “foo” is implied|
||throw away the listing file|
||send the object file to drive B|
Since we gave only a drive letter in response to the
Object file prompt,
the assembler defaults to a file name of
resulting in the object file being generated as
Okay, now let’s introduce subdirectories into DOS 2.0.
Suppose you have want to assemble
and put the result into
Here’s how you do it:
A> B: B> CD \OBJ B> A: A> CD \SRC A> asm foo Assembler version blah blah blah Source File: FOO.ASM Listing file [FOO.LST]: NUL Object file [FOO.OBJ]: B:
The assembler reads from
A:FOO.ASM and writes
but since the current directory is tracked on a per-drive basis,
the results are
B:\OBJ\FOO.OBJ as desired.
If the current directory were not tracked on a per-drive basis,
then there would be no way to tell the assembler to put its
output into a subdirectory.
As a result,
DOS 1.0 programs were effectively limited to operating on
files in the root directory,
which means that nobody would put files in subdirectories
(because their programs couldn’t access them).
From a DOS 1.0 standpoint, changing the current directory on a drive performs the logical equivalent of changing media. “Oh look, a completely different set of files!”
Short attention span.
Remembering the current directory for each drive has been preserved
at least for batch files,
although there isn’t actually such a concept as a per-drive current
directory in Win32.
In Win32, all you have is a current directory.
The appearance that each drive has its own current directory
is a fake-out by
cmd.exe, which uses
strange environment variables
to create the illusion to batch files that each
drive has its own current directory.
Dean continues, “Why not merge them? I have to set both the dir and drive if i want a specific working dir.”
The answer to the second question is, “They already are merged.
cmd.exe that tries to pretend that they aren’t.”
And if you want to set the directory and the drive from the command
prompt or a batch file, just use the
/D option to the
D:\> CD /D C:\Program Files\Windows NT C:\Program Files\Windows NT> _
(Notice that the
CHDIR command lets you omit quotation
marks around paths which contain spaces:
Since the command takes only one path argument,
the lack of quotation marks does not introduce ambiguity.