有人可以帮我将文件从共享文件夹复制到本地驱动器吗?我的代码是:
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 /)。另外,我只能阅读源文件。你能帮我修改代码或建议吗?谢谢。
答案 0 :(得分:8)
可能会将auth添加到第二个文件中:
SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak",**auth**);
使用SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE",auth).canWrite
你知道你是否对父目录有写权限
答案 1 :(得分: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;
}
}`
答案 2 :(得分:2)
我得到了它的工作。在进行复制之前,我必须“创建”目标文件。尝试将下面的中间行添加到原始代码段中,看看是否有效。
SmbFile dest = new SmbFile ("C:/SQLRESTORESTAGE/v2.bak");
dest.createNewFile();
dir.copyTo(dest);
答案 3 :(得分:2)
这是为了澄清。 “登录失败:未知的用户名或密码错误。”例如,当您使用1.3.18而不是1.2.25时,可以显示。 这可能是因为不同的兼容性设置:
第一种方法是在NtlmPasswordAuthentication
之前使用它 n
它可以解决此问题。
答案 4 :(得分:-2)
您必须使用文件:protocol
SmbFile dest = new SmbFile ("file:" + "C:/SQLRESTORESTAGE/v2.bak");