problema de rendimiento cuando se mueve de archivos en redes compartidas
-
27-09-2019 - |
Pregunta
Estoy escribiendo una aplicación que puede copiar archivos en una red compartida. Por lo general, los archivos se mueven en el mismo disco duro físico. Si se prueba esto con el Explorador de Windows, esta operación se ejecutará muy rápido. Parece, que Windows sabe sobre el mismo lugar y hace un movimiento real y no una copia y borrar (que sería más lento).
Vamos a decir que desea copiar un conjunto de archivos:
\\computer\share\fileA.txt
\\computer\share\fileB.txt
El destino es por ejemplo:
\\computer\share\subfolder
La aplicación utiliza la API de Windows Shell (escribí la aplicación en Delphi, pero el problema debería ser el mismo para otros idiomas también):
with SHFileOpStruct do
begin
Wnd := 0;
wFunc := FO_MOVE;
pFrom := PChar ('\\computer\share\fileA.txt'+#0
+'\\computer\share\fileB.txt'+ #0#0);
pTo := PCahr ('\\computer\share\subfolder' + #0#0);
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
end;
Result := SHFileOperationW (SHFileOpStruct);
Por desgracia este código hace un "copiar y borrar" que es mucho más lento en archivos de gran tamaño o si tiene un montón de archivos. ¿Cómo puedo evitar esto? ¿Hay alguna manera de saber la operación de movimiento, que las carpetas están en el mismo disco duro? Tal vez hay alguna otra notación para la ruta de red.
O hay una función de la API que es diferente usos por el Explorador de Windows?
Para una comparación corta:
- número de archivos: 260
- tamaño de archivo para cada uno de los archivos: 11 kB
- tiempo para movimiento en Explorer: 2 seg
- tiempo para movimiento con SHFileOperation: 20 sec
Estoy utilizando Windows 7 en mi sistema de desarrollo, sino que también debería trabajar en XP así que no puedo utilizar la nueva interfaz IFileOperation.
Saludos cordiales
Solución
Me ignorar las funciones API de cáscara, y el uso de MoveFileEx
o MoveFileWithProgress
directamente.