2010-08-23 67 views
0

使用該庫連接到遠程服務器並複製文件。我有這個過程工作得很好,但有一些較小的東西,我似乎無法解決,因爲圖書館的文檔相當薄弱。SharpSSH進程和重命名

我有兩個例程工作。一個使用Tamir.SharpSsh類,另一個使用Tamir.SharpSsh.jsch類。

  1. 使用Tamir.SharpSsh類我可以將文件從本地服務器複製到遠程服務器,並打入pogress事件。我不能做的是確定遠程服務器上的特定文件是否在服務器上存在/Report/data.txt文件。如果存在或者不存在,我需要採取不同的行動。另外我將如何重命名遠程服務器上的文件。我試着用'重命名','rn'和'mv'命令嘗試使用SshExec,但它似乎不起作用。

  2. 使用Tamir.SharpSsh.jsch我可以將文件從本地服務器複製到遠程服務器。我也可以重命名遠程服務器上的文件。我不能用這個課程去挖掘進度事件以跟蹤複製進度。此外,我似乎找不到一個好方法來測試,以查看服務器上是否存在特定的文件。我想出了是原油和我能想出的唯一方法來測試,這是當一個或多個文件存在,我收到了數沒有問題,使用

    Dim c As ChannelSftp 
        Dim vct As Tamir.SharpSsh.java.util.Vector = c.ls(sRemoteFile) 
        Dim cnt As Integer = vct.Count 
    

。當沒有文件時拋出異常。

無論如何,我有例行工作,只是我需要幫助的一些小事情。

TIA AGP

回答

2

可以調用使用要檢查的文件的路徑Tamir.SharpSsh.Sftp.GetFile方法存在(例如C#,不好意思):

private bool FileExists(string filePath) 
{ 
    try 
    { 
     SftpConnection connection = new SftpConnection(_host, _username, _password); 
     connection.Connect(_port); 
     connection.Get(filePath, _toDir); 
    } 
    catch(JSchException) 
    { 
     return false; 
    } 
    return true; 
} 

我也通過我的使用這個庫注意到了一些其他問題 - 就像缺少一個GetFileInfo方法或者遞歸Get和Puts。但總體而言,它完成了工作。

簡單的事實是,Tamir.SharpSsh無法遠程重命名文件 - 它只是沒有實現該功能。你可以購買已經遠遠更多的功能,比如更好的圖書館:

  • 凱勒曼軟件.NET SFTP庫
  • wodSFTP.NET
  • Rebex的SFTP用於.NET
  • edtFTPnet/PRO

或者你可以擴展SharpSsh,因爲它是開源的。

+0

是的我嘗試了一些類似於Tamir.SharpSsh.jsch的東西,但對於我來說,你必須承認異常以檢測文件是否存在,這似乎很奇怪。這是我做了一陣回 – sinDizzy 2010-09-27 17:50:56

+1

是的,這很奇怪。此外,它的錯誤做法是使用邏輯異常而不是錯誤處理。我唯一可以做的其他建議是嘗試使用Rebex產品(http://www.rebex.net/sftp.net/),該產品具有'FileExists'方法來檢查服務器上是否存在文件。這些API在很大程度上是相同的,所以它很容易遷移到它,但它不是免費的。 – Nobody 2010-09-28 11:54:18

0

你的問題是因爲SFTP協議的侷限性。 - 要檢查文件是否存在,請嘗試返回該文件的屬性; - 目前大多數服務器不支持文件重命名。

+0

林不知道我明白。我可以使用Tamir.SharpSsh.jsch重命名文件沒有問題。我只是想和Tamir.SharpSsh一樣。我也可以使用Bitvise Tunnelier的GUI進行重命名。我已經完成了一百次,現在我只想將它自動化。我會檢查文件屬性,但可能已經發誓我已經嘗試過。 – sinDizzy 2010-08-24 18:22:50

+0

Nickolay,SFTP確實支持重命名文件。它也支持更多。這是_implementation_(SharpSsh)不支持它們。我指的是協議規範第7頁中列出的SSH_FXP_RENAME數據包類型:http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13 – Nobody 2010-09-23 11:59:10

+0

是的,協議支持此功能。但是大多數SFTP協議實現都不是。 – 2010-09-23 13:28:25

0

是的我嘗試了一些類似於Tamir.SharpSsh.jsch,但對於我來說似乎很奇怪,你必須捕捉異常來檢測文件的不存在。這是我貼後我做了什麼:

Private Function FileExistsOnServer(ByVal c As ChannelSftp, ByVal sRemoteFile As String) As Boolean 
    Try 
     'get a file listing of the file 
     Dim vct As Tamir.SharpSsh.java.util.Vector = c.ls(sRemoteFile) 
     Dim cnt As Integer = vct.Count 

     'if the count is greater than zero then the file already exists. if its 0 then the file does 
     'not exist on the server 
     If cnt > 0 Then 
      Return True 
     Else 
      Return False 
     End If 
    Catch ex As Exception 
     'if we get an exception then assume the file does not exist on the server 
     Return False 
    End Try 
End Function