Дело об ошибке копирования файлов

Недавно один мой знакомый обратился ко мне за помощью. По его словам, он столкнулся с проблемой при копировании изображений на флэш-накопитель USB. После успешного копирования двух с лишним сотен фотографий на экране появилось диалоговое окно с сообщением об ошибке (см. иллюстрацию). Впоследствии оно появлялось при каждой повторной попытке выполнить копирование.

clip_image001

К сожалению, сообщение “The directory or file cannot be created” (Не удается создать файл или папку) никоим образом не указывало на причину проблемы, обозначало ее как непредвиденную и не сообщало, где именно следует искать «дополнительные сведения». Уровень грамотности моего знакомого был достаточно высок, чтобы, прежде чем обратиться ко мне, убедиться в том, что места на диске было достаточно, и запустить служебную программу Chkdsk для проверки на предмет повреждений диска. Впрочем, результата это не принесло, и ошибка продолжала появляться при всех последующих попытках копирования изображений на флэш-накопитель. В большом недоумении, знакомый обратился ко мне.

Я попросил его записать трассировку программой мониторинга файловой системы и реестра в реальном времени Process Monitor, которая позволяет выявить ошибки ОС, фактически возвращаемые файловой системой. Справившись с задачей, он отправил мне отчет программы в виде PML-файла, который я и открыл на собственном компьютере. Ограничив с помощью фильтра предмет исследования одним томом и операциями, связанными с копированием файлов, я стал изучать трассировку на наличие ошибок снизу вверх. Это не составило труда - уже в последней строке была замечена ошибка, которая, по всей видимости, и инициировала появление диалогового окна.

clip_image002

С целью экономии пространства экрана программа Process Monitor удаляет из кодов ошибок префикс "STATUS", поэтому на самом деле выделенная ошибка ОС обозначается как STATUS_CANNOT_MAKE. Честно говоря, в момент обнаружения я не имел о ней никакого представления. Вообще-то тогда еще программа Process Monitor показывала даже не текстовый, а шестнадцатеричный код ошибки - 0xc00002ea, так что ее текстовый код пришлось поискать в заголовочном файле Ntstatus.h из пакета для разработчиков драйверов устройств для Windows, а впоследствии добавить в Process Monitor функцию, конвертирующую коды ошибок в текст.

В этот момент я мог бы схитрить и поискать ошибку в исходном коде ОС Windows, но мне хотелось выяснить, что в этой ситуации смогут сделать люди, не имеющие такой возможности. Поискав в Интернете, я наткнулся на старую цепочку обсуждений в группе новостей для разработчиков файловой системы Windows.

clip_image003

Действительно, как выяснилось, том был отформатирован с применением файловой системы FAT. Поскольку файлов на диске было много, а некоторые из них имели длинные имена, проблема с заполнением всех 512 записей, отведенных под дочерние элементы корневого каталога, вполне могла возникнуть.

Итак, загадка была разгадана. Я посоветовал знакомому два варианта: либо создать в корневом каталоге тома подкаталог и скопировать оставшиеся файлы туда, либо отформатировать том с применением файловой системы FAT32, тем самым сняв ограничение на число дочерних элементов корневого каталога.

Впрочем, один вопрос оставался нерешенным. Почему вообще диск был отформатирован на основе файловой системы FAT, а не FAT32? Это связано как с политикой производителя флэш-накопителя, так и с особенностями диалогового окна форматирования ОС Windows. Я не уверен, но могу предположить, что многие производители флэш-накопителей форматируют свои устройства на основе файловой системы FAT, поскольку в таком случае они гарантированно работают практически во всех операционных системах, в том числе в тех, что не поддерживают файловую систему FAT32, как то DOS 6 и Windows 95.

Что касается современных версий ОС Windows, то я думал, что по умолчанию в них при форматировании предлагается файловая система FAT32, но, открыв диалоговое окно форматирования одного из своих USB-накопителей, я понял, что ошибался.

clip_image004

В Интернете мне не удалось найти описание алгоритма, которого придерживается это диалоговое окно, так что пришлось покопаться в исходном коде Windows. Оказалось, что при форматировании съемных томов (за исключением компакт-дисков) емкостью менее 4 ГБ по умолчанию предлагается файловая система FAT.

Полагаю, что дело об ошибке копирования файлов можно считать раскрытым, но есть две задачи, которые мне еще предстоит решить: во-первых, попробовать добиться замены сообщения об ошибке на более информативное, а во-вторых, постараться убедить коллег сменить файловую систему, предлагаемую по умолчанию, на FAT32. Пожелайте мне удачи!