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:/SQLRESTORETAGE/)的问题。此外,我只有读取源文件的权限。你能帮我解决代码或建议吗?谢谢你。

4

5 回答 5

8

也许将身份验证添加到第二个文件:

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

你必须使用文件:协议

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