2011-07-14 57 views
3

ディレクトリ(この場合はC:\ test)をリモートホストに再帰的にコピーする必要があります。 GanymedのSCPClientを使用してディレクトリをコピーするにはどうすればよいですか?

conn.connect(); 
conn.authenticateWithPassword("user", "pw"); 
SCPClient scp = conn.createSCPClient(); 
scp.put("C:/test", "~/test"); 
conn.close(); 

が、これはエラーを与える:私は明白なことを試してみました

java.io.IOException: Error during SCP transfer. 
    at ch.ethz.ssh2.SCPClient.put(SCPClient.java:577) 
    at ch.ethz.ssh2.SCPClient.put(SCPClient.java:535) 
    at ch.ethz.ssh2.SCPClient.put(SCPClient.java:430) 
    at Test.Test.main(Test.java:57) 
Caused by: java.io.FileNotFoundException: C:\test (Access is denied) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at ch.ethz.ssh2.SCPClient.sendFiles(SCPClient.java:190) 
    at ch.ethz.ssh2.SCPClient.put(SCPClient.java:573) 
    ... 3 more 

私は何かが足りない、またはGanymedは本当に唯一の個々のファイルではなくディレクトリをコピーすることができますか?私はちょうどexec()シェル上の適切なscpコマンドですか?

答えて

3

ソースコードの関連部分を掘り下げた後、私は答えが「あなたがいない」ことは確かです。

パラメータとして1つ以上のファイル名を使用するすべてのput()メソッドは、最終的にはプライベートsendFiles()メソッドを呼び出して実際にファイルを送信します。このメソッドは、各ファイル名からFileオブジェクトを作成し、次に各ファイルからFileInputStreamオブジェクトを作成します。そして、確かに、FileInputStreamのコンストラクタはFileNotFoundExceptionをスローします。ファイルが存在しない場合、は通常のファイルではなくディレクトリです。または何らかの理由で読み込み用に開くことができません。 (そして、どうやら、それは常に正しいエラーメッセージを表示して、それをスローしません。)


EDIT:すべての公正で、それはコピーしたディレクトリ独自の再帰関数を展開する、全く難しいことではありませんけれども:

private static void putDir(Connection conn, String localDirectory, String remoteTargetDirectory, String mode) throws IOException { 
    final String[] fileList = curDir.list(); 
    for (String file : fileList) { 
     final String fullFileName = localDirectory + "/" + file; 
     if (new File(fullFileName).isDirectory()) { 
      final String subDir = remoteTargetDirectory + "/" + file; 
      Session sess = conn.openSession(); 
      sess.execCommand("mkdir " + subDir); 
      sess.waitForCondition(ChannelCondition.EOF, 0); 
      putDir(conn, fullFileName, subDir, mode); 
     } 
     else { 
      SCPClient scpc = conn.createSCPClient(); 
      scpc.put(fullFileName, remoteTargetDirectory, mode); 
     } 
    } 
} 
+0

私は同じ問題を抱えていますが、私は "putDir"関数を理解していますが、 "getDir"についてはどうでしょうか。 scpクライアントを使って、リモートマシン上のディレクトリにあるファイル/ディレクトリのリストを取得する方法はありますか? –

関連する問題