6

誰かが共有フォルダからローカルドライブにファイルをコピーするのを手伝ってもらえますか?私のコードは次のとおりです。

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;;


public class smb {

      /**
      * @param args
      * @throws IOException
       */
      public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub


          String urlToBackUpFile = "smb://ip/backup$/test.txt"; 
          System.out.println("smb folder of source file" + urlToBackUpFile);
          NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, "login", "pass");


            SmbFile dir = new SmbFile(urlToBackUpFile, auth);
            System.out.println(dir.getDate());
            SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak");
            dir.copyTo(dest);
      }
}

ファイルファイルはコピーされません。「サーバーへの接続に失敗しました」というメッセージが表示されましたが、プログラムにソースファイルのdir.getDate()(およびファイル名と長さ)が表示されます。したがって、宛先フォルダー(C:/ SQLRESTORESTAGE /)に問題があると思います。また、ソースファイルを読み取るための条件もあります。コードを修正したり、何かアドバイスしたりするのを手伝ってもらえますか?ありがとうございました。

4

5 に答える 5

8

多分2番目のファイルに認証を追加します:

SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak",**auth**);

SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE",auth).canWrite 親ディレクトリへの書き込み権限があるかどうかを知っている

于 2012-11-16T20:29:07.457 に答える
7

多くの試行錯誤の末、私にとって確実に機能した唯一の方法は、古い学校に行き、FileInputStreamとFileOutputStreamを次のように使用することでした。

   `SmbFile[] files = getSMBListOfFiles(sb, logger, domain, userName, password, sourcePath, sourcePattern);

    if (files == null)
        return false;
    output(sb, logger, "      Source file count: " + files.length);
    String destFilename;
    FileOutputStream fileOutputStream;
    InputStream fileInputStream;
    byte[] buf;
    int len;
    for (SmbFile smbFile: files) {
        destFilename = destinationPath + smbFile.getName();
        output(sb, logger, "         copying " + smbFile.getName());
        try {
            fileOutputStream = new FileOutputStream(destFilename);
            fileInputStream = smbFile.getInputStream();
            buf = new byte[16 * 1024 * 1024];
            while ((len = fileInputStream.read(buf)) > 0) {
                fileOutputStream.write(buf, 0, len);
            }
            fileInputStream.close();
            fileOutputStream.close();
        } catch (SmbException e) {
            OutputHandler.output(sb, logger, "Exception during copyNetworkFilesToLocal stream to output, SMP issue: " + e.getMessage(), e);
            e.printStackTrace();
            return false;
        } catch (FileNotFoundException e) {
            OutputHandler.output(sb, logger, "Exception during copyNetworkFilesToLocal stream to output, file not found: " + e.getMessage(), e);
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            OutputHandler.output(sb, logger, "Exception during copyNetworkFilesToLocal stream to output, IO problem: " + e.getMessage(), e);
            e.printStackTrace();
            return false;
        }
    }`
于 2013-07-28T21:45:58.373 に答える
3

私はそれを機能させました。コピーを行う前に、宛先ファイルを「作成」する必要がありました。以下の真ん中の行を元のコードスニペットに追加して、それが機能するかどうかを確認してください。

SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak");
dest.createNewFile();
dir.copyTo(dest);
于 2015-01-16T16:04:35.767 に答える
2

これは明確にするためです。ログオンに失敗しました:不明なユーザー名または不正なパスワード。」たとえば、1.3.18を使用しているが、1.2.25では表示できない場合に表示されます。互換性の設定が異なることが原因である可能性があります。

  1. jcifs.smb.lmCompatibility = 0または1:LMおよびNTLMを送信2)
  2. jcifs.smb.lmCompatibility = 2:両方のフィールドでNTLMを送信します3)
  3. jcifs.smb.lmCompatibility = 3、4、または5:LMv2のみを送信する

最初の方法は、NtlmPasswordAuthenticationの前に使用することです

jcifs.Config.setProperty( "jcifs.smb.lmCompatibility", "3");

この問題を解決できます。

于 2015-05-14T09:17:42.423 に答える
-2

次のファイルを使用する必要があります:protocol

SmbFile dest = new SmbFile ("file:" + "C:/SQLRESTORESTAGE/v2.bak");
于 2015-01-12T06:38:43.163 に答える