2012-06-01 103 views
6

使用WinSCP的.NET程序集上傳文件。 OperationResultBase.Check()拋出以下錯誤:WinSCP:如何確保SFTP上傳從.zip.filepart重命名爲.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.

看來,出現這種情況與我嘗試發送任何zip文件。如果它有所作爲,這些是使用DotNetZip庫創建的zip文件。

代碼,我用的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表示該組件還不允許轉移開支持編程控制。有沒有解決方法?

+1

這似乎很奇怪,我認爲上載使用不同的文件名比實際所需的文件名。你有控制權嗎? – sarnold

+0

@sarnold,來自WinSCP文檔:「當使用SFTP協議傳輸文件時,它首先傳輸到一個帶有.filepart擴展名的臨時文件中,只有在傳輸完成後,擴展才會被刪除。 – sigil

+0

如果您有權訪問服務器,是否可以從SysInternals運行諸如Process monitor之類的東西來查看文件上傳完成後會發生什麼。例如,防病毒程序可能會在文件關閉時開始掃描文件,並且在嘗試重命名時仍然訪問該文件。 – sgmoore

回答

4

聽起來好像文件上傳到目標服務器上的文件系統不允許文件更改權限。這可能會導致上傳完成時文件重命名失敗,儘管整個文件已上傳並且正在使用傳輸過程中使用的臨時文件名寫入文件系統。如果您沒有對目標服務器的管理訪問權限,則可以通過嘗試重命名已存在於目標服務器上的文件來對其進行測試。如果這也失敗了,那麼您需要在目標服務器上擁有適當的權限才能正常工作。否則,您可能必須使用錯誤消息中提供的建議來關閉恢復支持,以便它最初打開時用所需的文件名而不是臨時文件名(使用.filepart擴展名)進行寫入。

+0

@sarnold - 你是對的,我在迴應中並沒有提到SCP,而是一直指着FTP。我正在打字時通過FTP下載一些日誌文件,因此出現命名錯誤。將會修復,因爲迴應本來就是按照預期的。 – dmarietta

+0

我可以使用WinSCP的GUI會話手動更改文件名。正如我在問題結束時指出的,.NET程序集沒有控制傳輸恢復支持的功能。 WinSCP是開源的,所以我可以爲我想要的函數編寫一個C#包裝器,但我希望能有一個更快的解決方案。 – sigil

+0

關於此問題的另一個簡要說明:我有權更改目標服務器上的文件名。另外,當我使用GUI進行上傳時,上傳過程可以正常工作;它只是當我試圖通過.NET來做它失敗。 – sigil

0

如果包含完整的錯誤消息,包括由服務器返回的根本原因,這將有所幫助。

我的猜測是在服務器端運行了防病毒應用程序(或類似的)。上傳完成後,防病毒應用程序將檢查任何文件。與WinSCP衝突後,嘗試在上傳完成後重命名文件。對於.ZIP檔案來說,這個問題可能會更頻繁地發生,或者是因爲它們往往更大,或者僅僅是因爲它們需要在檢查前抽取(需要花費時間)。

無論如何,您可以使用TransferOptions.ResumeSupport禁用傳輸到臨時文件名。

又見了error message "Transfer was successfully finished, but temporary transfer file ... could not be renamed to target file name ..."

1

關閉resumesupport文檔:

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