如何从本地复制文件以与JCifs共享?

时间:2014-04-08 10:57:54

标签: java samba jcifs

我可以将文件从共享复制到本地。但我想切换,并将文件从本地复制到共享。

I am trying this code:
SmbFile oldFile = new SmbFile("c:/tmp/test.xml");
SmbFile newFile = new SmbFile("smb://someone_pc/tmp/test.xml", new NtlmPasswordAuthentication("", username, password));
oldFile.copyTo(newFile);

但我在copyTo方法上遇到例外:

Invalid operation for workgroups or servers

如何将文件从本地复制到共享?

5 个答案:

答案 0 :(得分:3)

使用Javi_Swift之类的流,通过SMB协议将文件从本地文件复制到共享磁盘的完整解决方案(部分书写 - 无法将整个文件加载到内存中的大文件解决方案):

// local source file and target smb file
File fileSource = new File("C:/example.jpg");
SmbFile smbFileTarget = new SmbFile(smbFileContext, "example.jpg");
// input and output stream
FileInputStream fis = new FileInputStream(fileSource);
SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFileTarget);
// writing data
try {
    // 16 kb
    final byte[] b  = new byte[16*1024];
    int read = 0;
    while ((read=fis.read(b, 0, b.length)) > 0) {
        smbfos.write(b, 0, read);
    }
}
finally {
    fis.close();
    smbfos.close();
}

答案 1 :(得分:2)

前一段时间我和jcifs合作过。 您可以尝试newFile.createNewFile();然后使用copyTo。 如果这不起作用,请尝试newFile.getOutputStream()并将数据写入此流而不是使用copyTo

答案 2 :(得分:1)

我参加聚会有点晚了,但这可能对其他人提出这个问题很有用。

我使用流将文件从本地上传到共享,并且它没有任何问题。我的代码是:

SmbFile remoteFile =  new SmbFile(remotePath, auth);
SmbFileOutputStream out = new SmbFileOutputStream(remoteFile);
FileInputStream fis = new FileInputStream(localFile);
out.write(IOUtils.toByteArray(fis));
out.close();

答案 3 :(得分:1)

使用Java 1.7' Files类:

的示例
Path source = Paths.get("c:/tmp/test.xml");
SmbFile newFile = new SmbFile("smb://someone_pc/tmp/test.xml", new NtlmPasswordAuthentication("", username, password));
try (OutputStream out = newFile.getOutputStream())
{
    Files.copy(source, out);
}

答案 4 :(得分:0)

public void uploadToSmb(String destinationPath,File localFile){
    public final static byte[] BUFFER = new byte[10 * 8024];
        ByteArrayInputStream inputStream = null;
        SmbFileOutputStream sfos = null;
        try {
            String user = username + ":" + password;
            int lenghtOfFile = (int) localFile.length();
            byte[] data = FileUtils.readFileToByteArray(localFile);
            inputStream = new ByteArrayInputStream(data);
            String path = destinationPath + localFile.getName();
            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);
            remoteFile = new SmbFile(path, auth);
            sfos = new SmbFileOutputStream(remoteFile);
            long total = 0;
            while ((count = inputStream.read(BUFFER)) > 0) {
                total += count;
                // publishing the progress....
                // After this onProgressUpdate will be called
                int percentage = (int) ((total / (float) lenghtOfFile) * 100);
                publishProgress(percentage);
                //  publishProgress((int) ((total * 100) / lenghtOfFile));
                // writing data to file
                    sfos.write(BUFFER,0,count);

            }
                sfos.flush();
                inputStream.close();
                sfos.close();

        } catch (Exception e) {
            e.printStackTrace();
        } 
      }  

这段代码工作得很好......