2012-06-01 25 views
6

Verwenden der .NET-Assembly von WinSCP zum Hochladen einer Datei. OperationResultBase.Check() werfen den folgenden Fehler:WinSCP: Wie kann sichergestellt werden, dass der SFTP-Upload von .zip.filepart in .zip umbenannt wird?

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.

Es scheint, dass dies mit jeder Zip-Datei passiert, dass ich zu senden versuchen. Wenn es einen Unterschied macht, sind dies ZIP-Dateien, die mit der DotNetZip-Bibliothek erstellt wurden.

Code, ich verwende, so ziemlich direkt aus dem Beispiel in der Dokumentation WinSCP genommen:

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 zeigt an, dass die Baugruppe noch nicht programmatische Steuerung der Übertragung resume Unterstützung ermöglichen. Gibt es einen Workaround dafür?

+1

Mir scheint es seltsam, dass der Upload einen anderen Dateinamen verwendet als der Dateiname tatsächlich gewünscht wird. Hast du die Kontrolle darüber? – sarnold

+0

@sarnold, aus der WinSCP-Dokumentation: "Wenn eine Datei mit SFTP-Protokoll übertragen wird, wird sie zuerst in eine temporäre Datei mit der Erweiterung .filepart übertragen. Erst nachdem die Übertragung abgeschlossen ist, wird die Erweiterung entfernt." – sigil

+0

Wenn Sie Zugriff auf den Server haben, ist es möglich, etwas wie Process Monitor von SysInternals auszuführen, um zu sehen, was passiert, wenn der Upload der Datei abgeschlossen ist. Zum Beispiel könnte ein Antiviren-Programm die Datei in dem Moment scannen, in dem die Datei geschlossen wird, und trotzdem auf die Datei zugreifen, wenn das Umbenennen versucht wird. – sgmoore

Antwort

4

Es klingt, als ob das Dateisystem auf dem Zielserver, auf den die Datei hochgeladen wird, keine Berechtigungen zur Dateiänderung zulässt. Dies könnte dazu führen, dass das Umbenennen der Datei am Ende des Uploads fehlschlägt, obwohl die vollständige Datei hochgeladen und mit dem temporären Dateinamen, der während der Übertragung verwendet wurde, in das Dateisystem geschrieben wurde. Wenn Sie keinen Administratorzugriff auf den Zielserver haben, können Sie dies testen, indem Sie versuchen, eine Datei umzubenennen, die sich bereits auf dem Zielserver befindet. Wenn dies ebenfalls fehlschlägt, müssen entweder die entsprechenden Berechtigungen auf dem Zielserver geändert werden, damit dies funktioniert. Andernfalls müssen Sie möglicherweise den Hinweis in Ihrer Fehlernachricht verwenden, um die Fortsetzungsunterstützung zu deaktivieren, sodass sie zum Schreiben mit dem gewünschten Dateinamen anstelle des temporären Dateinamens (mit der Erweiterung .filepart) geöffnet wird.

+0

@sarnold - Sie sind richtig, ich habe in meiner Antwort auf FTP anstelle von SCP verwiesen. Ich habe einige Log-Dateien über FTP heruntergeladen, während ich tippte, also der Fehler in der Nomenklatur. Wird behoben, da die Antwort ansonsten wie vorgesehen ist. – dmarietta

+0

Ich kann den Dateinamen manuell mit einer GUI-Sitzung von WinSCP ändern. Wie ich am Ende meiner Frage notiert habe, hat die .NET-Assembly keine Funktion zur Kontrolle der Transfer-Resume-Unterstützung. WinSCP ist Open Source, also kann ich einen C# -Wrapper für die gewünschte Funktion schreiben, aber ich habe auf eine schnellere Lösung gehofft. – sigil

+0

Noch eine kurze Anmerkung zu diesem Thema: Ich bin berechtigt, Dateinamen auf dem Zielserver zu ändern. Außerdem funktioniert der Upload-Prozess gut, wenn ich die GUI benutze. es ist nur, wenn ich es über .NET versuche, dass es fehlschlägt. – sigil

0

Es würde helfen, wenn Sie vollständige Fehlermeldung enthalten, einschließlich der vom Server zurückgegebenen Ursache.

Meine Vermutung ist, dass es eine Antiviren-Anwendung (oder ähnliches) auf dem Server-Seite ausgeführt wird. Die Antiviren-Anwendung überprüft jede Datei nach Abschluss des Uploads. Das Konflikt mit WinSCP versuchen, die Datei umzubenennen, sobald der Upload abgeschlossen ist. Das Problem tritt häufiger bei .ZIP-Archiven auf, entweder weil sie größer sind oder weil sie vor der Überprüfung extrahiert werden müssen (was Zeit kostet).

Wie auch immer, Sie können die Übertragung in den temporären Dateinamen unter Verwendung der TransferOptions.ResumeSupport deaktivieren.

Siehe auch die Dokumentation für die error message "Transfer was successfully finished, but temporary transfer file ... could not be renamed to target file name ..."

1

Schalten Sie den resumesupport:

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