Программное отключение носимых USB Flash дисков в Windows

Автор: Александр Бельченко
Дата: 31 января 2006
Простой рецепт, описывающий программное отключение (размонтирование) USB Flash дисков в Windows 2000/XP из командной строки.

По роду моей работы мне часто приходится переносить данные между компьютерами на USB Flash дисках (флэшках). Часто при этом я работаю на нескольких разных системах: как Windows, так и Linux. Эти системы имеют разные внутренние подходы к реализации подключения и отключения таких дисков.

Так в Linux для подключения и отключения флэшек используются специальные команды управления файловой системой mount и umount. В русской кальке процесс подключения флэшки называют монтированием, а процесс отключения соответственно размонтированием.

Windows отличается большей услужливостью по отношению к пользователю: при подключении флэшки к USB разъему она обнаруживается системой Plug-n-Play и автоматически "монтируется" в файловую систему. Для безопасного отключения флэшки вам необходимо провести некоторые пассы руками и "мышкой", щелкнув по иконке с зеленой стрелкой в лотке рядом с часами и указать какую флэшку вы хотите отключить:

ejecting.png

Подход, реализованный в Linux позволяет программисту более гибко управлять работой с флэшками. Подход, реализованный в Windows, ориентирован на удобства простых пользователей. Все в соответствии со знаменитой статьей Джоэля Спольски "Biculturalism".

Впрочем ОС Windows устроена достаточно хитро и запутано, и в ней практически все, что можно сделать мышкой, можно сделать и программными средствами, используя соответствующие функции API. Проведя соответствующий поиск в интернете и в MSDN можно найти искомую информацию, и, в частности, готовую консольную программу (с исходными текстами) deveject (автор Matthias Withopf).

На основе этой программы я сделал для себя удобный эквивалент umount, обвернув вызов deveject в batch-файл примерно следующего содержания:

full\path\to\deveject.exe -EjectDrive:%1

Сохранив такой файл с именем umount.bat и поместив его в каталог, который перечислен в переменной окружения PATH, я получил возможность из командной строки или даже из make-файлов отключать флэшку в нужный момент:

C:\> umount g:

C:\>D:\user\app\deveject\deveject.exe -EjectDrive:g:
DevEject 1.0  2003 c't/Matthias Withopf

Ejecting  'Универсальный том' [STORAGE\REMOVABLEMEDIA\7&3386ABF6&0&RM]...ok.
1 device(s) ejected.

Вызывать команду следует с указанием в качестве аргумента имени флэш-диска (обязательно после буквы диска нужно указывать двоеточие — например, g:).

Данный рецепт имеет некоторые ограничения:

  1. Если на флэш-диске открыты файлы или просматриваются каталоги, то попытка отключить флэш-диск будет неудачной. В этом случае нужно убедиться, что все файлы и каталоги закрыты и попробовать еще раз.
  2. Если ваша флэшка разбита на несколько логических дисков, то отключить только один из них не получится. Отключать такие флэшки можно, используя утилиту deveject с ключом командной строки -EjectId.