Previous Entry Share Next Entry
Почему на каждом диске есть свой текущий каталог?
enrutranslation

Автор: Рэймонд Чен.
Оригинал статьи: Why does each drive have its own current directory?

Комментатор Dean Earley спрашивает: "Почему существуют понятия 'текущий каталог' и текущий диск? Почему бы не объединить их?"

Краткий ответ: первоначально у каждого диска был свой текущий каталог, а сейчас нет, но кажется, что это поведение сохранилось.

Теперь даем развернутый ответ. Вы и сами знаете достаточно, чтобы ответить на вопрос; нужно лишь объединить существующие сведения.

Отправимся на машине времени в эпоху DOS 1.0. Каждый том был представлен буквой диска, а подкаталогов не существовало. Это поведение было унаследовано от CP/M.

Программы времен DOS 1.0 не понимали, что такое подкаталог; они обращались к файлам, используя букву диска с именем файла, например, B:\PROGRAM.LST. Давайте запустим ассемблер (компиляторы были предназначены для богатых людей) и соберем на диске B программу, исходный текст которой находится на диске A.
 
A>asm foo                          подразумевается расширение ".asm"
Assembler version blah blah blah
Source File: FOO.ASM
Listing file [FOO.LST]: NUL        выбрасываем файл листинга
Object file [FOO.OBJ]: B:          создаем объектный файл на диске B


Поскольку в качестве имени объектного файла мы указали только букву диска, по умолчанию ассемблер использует имя FOO.OBJ, в результате будет создан файл B:FOO.OBJ.

Теперь введем в оборот подкаталоги в DOS 2.0. Представьте, что вы хотите ассемблировать файл A:\SRC\FOO.ASM в объектный файл B:\OBJ\FOO.OBJ. Вот как вы сделаете это:

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:

Ассемблер читает из файла A:FOO.ASM и записывает в файл B:FOO.OBJ, но, поскольку для каждого диска есть свой текущий каталог, он работает с файлами A:\SRC\FOO.ASM и B:\OBJ\FOO.OBJ, как и ожидалось. Если бы для каждого диска не отслеживался свой текущий каталог, то было бы невозможно заставить ассемблер сохранить результат в подкаталоге. Для программ DOS 1.0 область операций с файлами фактически была ограничена корневым каталогом, а это означало, что никто не мог работать с файлами в подкаталогах (потому что программы не могли добраться до них).

С точки зрения DOS 1.0, смена текущего каталога на диске логически эквивалентна смене носителя. "Ух ты, это совсем другие файлы!"

Минуту внимания.

Текущий каталог каждого диска запоминается до сих пор, по крайней мере, для пакетных файлов, несмотря на то, что Win32 не поддерживает концепцию текущего каталога для каждого диска. Win32 содержит только понятие "текущий каталог". Отдельный текущий каталог на каждом диске - это иллюзия для пакетных файлов, которую командный процессор cmd.exe создает с помощью странных переменных окружения.

Dean продолжает: "Почему бы не объединить их? Мне приходится задавать и каталог, и диск, если мне нужен конкретный рабочий каталог. "

Ответ на второй вопрос звучит так: "Они уже объединены, а cmd.exe пытается изображать, что это не так". Если вы хотите задать каталог и диск из командной строки или пакетного файла, то используйте параметр /D команды CHDIR.

D:\> CD /D C:\Program Files\Windows NT
C:\Program Files\Windows NT> _

Обратите внимание на то, что команда CHDIR позволяет не заключать в кавычки пути с пробелами. Поскольку команда использует только один аргумент, отсутствие кавычек не приводит к неоднозначному толкованию пути.

?

Log in