2012-06-01 23 views
6

Utilizzo dell'assembly .NET di WinSCP per caricare un file. OperationResultBase.Check() sta gettando il seguente errore:WinSCP: Come assicurarsi che il caricamento SFTP venga rinominato da .zip.filepart in .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.

Sembra che questo accade con qualsiasi file zip che provo a trasmettere. Se fa la differenza, questi sono file zip che sono stati creati usando la libreria DotNetZip.

codice che sto usando, preso praticamente direttamente dall'esempio nella documentazione 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 che il gruppo non consente ancora il controllo programmatico di sostegno trasferimento di riprendere. C'è una soluzione per questo?

+1

Sembra strano a me che il caricamento sta usando un nome diverso rispetto al nome del file in realtà desiderata. Hai il controllo su questo? – sarnold

+0

@sarnold, dalla documentazione WinSCP: "Quando si trasferisce un file con il protocollo SFTP, viene prima trasferito in un file temporaneo con estensione .filepart Solo dopo il completamento del trasferimento l'estensione viene rimossa." – sigil

+0

Se si ha accesso al server, è possibile eseguire qualcosa come Process monitor da SysInternals per vedere cosa succede quando termina il caricamento del file. Ad esempio, un programma antivirus potrebbe avviare la scansione del file nel momento in cui il file viene chiuso e continuare ad accedere al file quando si tenta di rinominare. – sgmoore

risposta

4

Sembra che il filesystem sul server di destinazione in cui viene caricato il file non permetta autorizzazioni di modifica dei file. Ciò potrebbe causare il fallimento della ridenominazione del file al termine del caricamento, nonostante il fatto che il file completo sia stato caricato e scritto nel file system con il nome del file temporaneo utilizzato mentre il trasferimento era in corso. Se non si dispone dell'accesso amministrativo al server di destinazione, è possibile verificarlo cercando di rinominare un file già presente sul server di destinazione. Se anche questo non dovesse funzionare, sarà necessario che le autorizzazioni appropriate sul server di destinazione siano cambiate affinché funzioni. In caso contrario, potrebbe essere necessario utilizzare il consiglio fornito nel messaggio di errore per disattivare il supporto di ripristino in modo che sia inizialmente aperto per la scrittura con il nome file desiderato anziché il nomefile temporaneo (con l'estensione .filepart).

+0

@sarnold - Sei corretto, ho continuato a fare riferimento a FTP nella mia risposta invece di SCP. Stavo scaricando alcuni file di registro tramite FTP mentre stavo scrivendo, quindi l'errore nella nomenclatura. Risolverà, in quanto la risposta è altrimenti come previsto. – dmarietta

+0

Posso modificare manualmente il nome file utilizzando una sessione GUI di WinSCP. Come ho notato alla fine della mia domanda, l'assemblato .NET non ha una funzione per controllare il supporto del curriculum di trasferimento. WinSCP è open source, quindi posso scrivere un wrapper C# per la funzione che desidero, ma speravo in una soluzione più veloce. – sigil

+0

Un'altra breve nota al riguardo: ho il permesso di cambiare i nomi dei file sul server di destinazione. Inoltre, il processo di caricamento funziona correttamente quando lo faccio utilizzando la GUI; è solo quando provo a farlo attraverso .NET che fallisce. – sigil

0

Sarebbe utile, se si includesse il messaggio di errore completo, inclusa la causa principale restituita dal server.

La mia ipotesi è che ci sia un'applicazione antivirus (o simile) in esecuzione sul lato server. L'applicazione antivirus controlla qualsiasi file al termine del caricamento. Ciò è in conflitto con WinSCP tentativo di rinominare il file una volta che il caricamento è finito. Il problema può tendere a verificarsi più frequentemente per gli archivi .ZIP, perché tendono ad essere più grandi o semplicemente perché devono essere estratti prima del controllo (cosa richiede tempo).

In ogni caso, è possibile disabilitare il trasferimento al nome di file temporaneo utilizzando TransferOptions.ResumeSupport.

Vedere anche la documentazione relativa al error message "Transfer was successfully finished, but temporary transfer file ... could not be renamed to target file name ..."

1

Spegnere il resumesupport:

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