Ошибочное предположение, которое вы здесь делаете, состоит в том, что перемещение элементов подпапки в папке Explorer - это простая операция, которая включает в себя просто изменение пары записей каталога. Это не так. Низкоуровневый системный вызов для перемещения файла может быть. Но Microsoft Windows Explorer размещает слои поверх этого. "Перемещение" элемента папки может в конечном итоге быть «копировать в новое имя, а затем удалять оригинал» на низком уровне, а не "переименовывать эту запись каталога в этот родительский каталог". Конечно, первая операция намного дороже, чем вторая.
Почему Explorer делает это? Начнем с того, что папка не является каталогом. Не все "папки", которые Explorer предоставляет пользователю, являются добросовестными добросовестными каталогами на томе диска. Обозреватель должен, например, решить, что значит "переместить" каталог из / в виртуальную папку, обозначая удаленные файлы на смартфоне, просматриваемые через FTP-соединение Bluetooth. Это не простая операция переименования на уровне необработанного системного API. То же самое относится и к корзине, чье фактическое выражение на уровне необработанных файлов и каталогов зависит от формата файловой системы.
В Explorer есть "движок", который определяет, что на самом деле означают действия "копировать", "переместить", "переименовать" и "удалить" для объектов оболочки на уровне API системы. В проводнике, который поставляется в Windows NT 6.0 и более поздних версиях, операция "перемещение" - это IFileOperation::MoveItem()
. (Раньше это была функция SHFileOperation()
.) Существует целый ряд неочевидных вещей, которые продолжаются, даже в том, что можно ошибочно считать, что сопоставление может быть простым системным вызовом "переименования", чтобы обеспечить видимую конечному пользователю семантику "перемещения" элемента подпапки в Проводнике. Это включает в себя всю обработку для всех флагов операций, которые можно установить, которые могут включать в себя отмену записи информации, обнаружение коллизий и автоматическое переименование, проверку меток даты последнего изменения, переопределение старого дескриптора безопасности и обновление диалоговых окон прогресса.
Если вы хотите проверить, сколько времени требуется, чтобы изменить несколько записей каталога, используйте приложение, которое делает только это и не выполняет все слои Explorer поверх него, например команду mv
.