2012-06-01 48 views
6

Usando el ensamblado .NET de WinSCP para cargar un archivo. OperationResultBase.Check() es tirar el siguiente error:WinSCP: ¿Cómo asegurarse de que la carga de SFTP cambie de .zip.filepart a .zip?

WinSCP.SessionRemoteException: Transfer was successfully finished, but temporary transfer file 'testfile.zip.filepart' could not be renamed to target file name 'testfile.zip'. If the problem persists, you may want to turn off transfer resume support.

Parece que esto ocurre con cualquier archivo zip que intento enviar. Si hace una diferencia, estos son archivos zip creados con la biblioteca DotNetZip.

El código que estoy usando, tomada más o menos directamente desde el ejemplo en la documentación de WinSCP:

public void uploadFile(string filePath, string remotePath) 
{ 
    TransferOptions transferOptions = new TransferOptions(); 
    transferOptions.TransferMode = TransferMode.Binary; 
    TransferOperationResult transferResult; 
    transferResult = currentSession.PutFiles(filePath, remotePath, false, transferOptions); 
    transferResult.Check(); 
    foreach (TransferEventArgs transfer in transferResult.Transfers) 
    { 
     Console.WriteLine("Upload of {0} succeeded", transfer.FileName); 
    } 
} 

Discussion over at the WinSCP forum indica que el conjunto aún no permite un control programático de apoyo a la transferencia de reanudación. ¿Hay una solución para esto?

+1

Parece extraño para mí que la carga está utilizando un nombre de archivo diferente que el nombre del archivo deseado en realidad. ¿Tienes control sobre eso? – sarnold

+0

@sarnold, de la documentación de WinSCP: "Cuando se transfiere un archivo con el protocolo SFTP, primero se transfiere a un archivo temporal con la extensión .filepart. Solo después de que se complete la transferencia, se elimina la extensión". – sigil

+0

Si tiene acceso al servidor, ¿es posible ejecutar algo así como Process monitor from SysInternals para ver qué sucede cuando finaliza la carga del archivo? Por ejemplo, un programa antivirus puede comenzar a escanear el archivo en el momento en que se cierra el archivo y seguir accediendo al archivo cuando se intenta cambiar el nombre. – sgmoore

Respuesta

4

Parece que el sistema de archivos en el servidor de destino donde se carga el archivo no permite permisos de cambio de archivo. Esto podría estar causando que el cambio de nombre del archivo al final de la carga falle a pesar de que el archivo completo se cargó y se escribió en el sistema de archivos con el nombre de archivo temporal utilizado mientras la transferencia estaba en progreso. Si no tiene acceso administrativo al servidor de destino, puede probarlo al intentar cambiar el nombre de un archivo que ya está en el servidor de destino. Si eso también falla, deberá cambiar los permisos en el servidor de destino para que funcione. De lo contrario, es posible que deba utilizar los consejos proporcionados en su mensaje de error para desactivar el soporte de reanudación, de modo que inicialmente se abra para escribir con el nombre de archivo deseado en lugar del nombre de archivo temporal (con la extensión .filepart).

+0

@sarnold - Tiene razón, seguí refiriéndome a FTP en mi respuesta en lugar de SCP. Estaba descargando algunos archivos de registro a través de FTP mientras escribía, por lo tanto, el error en la nomenclatura. Se solucionará, ya que la respuesta es diferente a la prevista. – dmarietta

+0

Puedo cambiar manualmente el nombre de archivo usando una sesión GUI de WinSCP. Como señalé al final de mi pregunta, el ensamblado .NET no tiene una función para controlar el soporte de reanudación de transferencia. WinSCP es de código abierto, por lo que puedo escribir un contenedor C# para la función que quiero, pero esperaba una solución más rápida. – sigil

+0

Otra nota rápida sobre esto: tengo permiso para cambiar los nombres de los archivos en el servidor de destino. Además, el proceso de carga funciona bien cuando lo hago usando la GUI; es solo cuando intento hacerlo a través de .NET que falla. – sigil

0

Sería útil si incluyó un mensaje de error completo, incluida la causa raíz, tal como la devolvió el servidor.

Supongo que hay una aplicación de antivirus (o similar) ejecutándose en el servidor. La aplicación antivirus verifica cualquier archivo una vez que finaliza la carga. Eso entra en conflicto con el intento de WinSCP de cambiar el nombre del archivo una vez que finaliza la carga. El problema puede tender a ocurrir con mayor frecuencia para los archivos .ZIP, ya sea porque tienden a ser más grandes o simplemente porque deben extraerse antes del control (lo que lleva tiempo).

De todos modos, puede deshabilitar la transferencia al nombre de archivo temporal con el TransferOptions.ResumeSupport.

Véase también la documentación para la vuelta error message "Transfer was successfully finished, but temporary transfer file ... could not be renamed to target file name ..."

1

de la resumesupport:

put *.txt -nopreservetime -nopermissions -resumesupport=off 
Cuestiones relacionadas