A suposição errônea que você está fazendo aqui é que mover itens de subpasta em uma pasta do Explorer é uma operação simples que envolve simplesmente modificar algumas entradas de diretório. Não é. A chamada de sistema de baixo nível para mover um arquivo pode ser. Mas o Microsoft Windows Explorer coloca camadas acima disso. Um "movimento" de um item de pasta pode acabar sendo uma "cópia para novo nome e, em seguida, excluir original" no nível inferior em vez de "renomear essa entrada de diretório para esse diretório pai". Naturalmente, a primeira é uma operação muito mais cara que a segunda.
Por que o Explorer faz isso? Para começar, é porque uma pasta não é um diretório . Nem todas as "pastas" que o Explorer apresenta ao usuário são diretórios legítimos honestos em um volume de disco. O Explorer tem que, por exemplo, descobrir o que significa "mover" um diretório de / para uma pasta virtual indicando arquivos remotos em um telefone inteligente visto através de uma conexão FTP Bluetooth. Essa não é uma operação simples de renomeação no nível da API do sistema bruto. O mesmo acontece com a Lixeira, cuja expressão real no nível do arquivo e do diretório não processados é específica do formato do sistema de arquivos .
O Explorer tem um "mecanismo" que determina o que as ações "copiar", "mover", "renomear" e "excluir" para objetos shell realmente significam no nível da API do sistema bruto. No Explorer que vem no Windows NT 6.0 e posterior, a operação "mover" é o IFileOperation::MoveItem()
method . (Ela costumava ser a SHFileOperation()
function todos os sinalizadores de operação que podem ser definidos , que podem incluir gravação de informações de desfazer, detecção de colisão e criação automática de nome, verificação de dados de última modificação, Sobrescrevendo o antigo descritor de segurança e atualizando os diálogos de progresso.
Se você quiser testar quanto tempo leva para alterar algumas entradas do diretório, use um aplicativo que faça apenas isso , e não faça todas as camadas do Explorer sobre ele, como, por exemplo, o comando mv
.