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

¿Fue útil?

Solución

Me ignorar las funciones API de cáscara, y el uso de MoveFileEx o MoveFileWithProgress directamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top