分享

java SmbFile 读取服务器间的共享文件

 三十的狼 2018-09-15

package com;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

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

public class RemoteAccessData {

 public static void main(String[] args) throws Exception {
  // 远程url smb://192.168.100.86/test
  // 如果需要用户名密码就这样:
  // smb://username:password@192.168.100.86/test
  /*
   * Java利用SMB上传、下载、读取(内容或文件名)、复制、删除远程文件
   * smbGet1("smb://192.168.100.86/test/新建 文本文档.txt" ); smbGet(
   * "smb://192.168.100.86/test/新建 文本文档.txt" , "e:/" );
   * 需要jar包:jcifs-1.3.15.jar
   */
  // 得到共享目录下文件的大小 (测试成功)
      //smbGet1("smb://10086:10086@192.168.100.86/ybweatherweb/2-各类服务产品/23-专业服务产品/移动部门/2017/移动部门(20170411).doc");
  // 从共享目录下载指定文件到本地指定路径 (测试成功)
  
  
  //1.测试
  for (int i = 1; i < 11; i++) {
   smbGet("smb://192.168.70.190/public/010-0127111111-01-03-06.jpg", "E:/sharepublic/");
//   smbDelete("smb://192.168.70.190/public/"+i+".txt");
  }
  
  
  //2.测试
  String URL = "smb://192.168.70.190/public/";
  smbRead(URL);
  
  
  
  
  
  
  
  // 上传文件到共享目录 (测试成功)
  //smbPut("smb://10086:10086@192.168.100.86/ybweatherweb/2-各类服务产品/23-专业服务产品/移动部门/2017", "F:/4/");
  // 把共享目录指定文件夹下的文件拷贝到另外一个共享目录指定文件夹下(目录文件夹不存在,就创建) (测试成功)
  //smbCopy("192.168.100.86/ybweatherweb/2-各类服务产品/1-气象信息快报/每日天气报告/2017/草稿/", "192.168.100.86/ybweatherweb/2-各类服务产品/1-气象信息快报/每日天气报告/2017/审核后/");
  // 读取指定文件夹下的所有文件名(测试成功)
  //smbRead();
  // 删除共享目录下的指定文件(测试成功)
  //smbDelete();
  // 远程url smb://192.168.100.86/test
  // 如果需要用户名密码就这样:
  // smb://username:password@192.168.100.86/test
 }

 private static void smbRead(String URL) throws MalformedURLException {
  // 主要利用类 SmbFile 去实现读取共享文件夹 shareFile 下的所有文件(文件夹)的名称
//  String URL = "smb://192.168.70.190/public/";
  // String URL="smb://xxx:xxx@192.168.0.100/shareFile/";
  SmbFile smbfile = new SmbFile(URL);
  List list = new ArrayList();
  try {
   if (!smbfile.exists()) {
    System.out.println("no such folder");
   } else {
    SmbFile[] files = smbfile.listFiles();
    for (SmbFile f : files) {
     
     if(f.isFile()){
      list.add(f.getPath());
     }else{
      smbRead(f.getPath());
     }
     
     /*System.out.println(f.getName());
     System.err.println("1=========================================");
     System.err.println("1=="+f.getURL());
     System.err.println("2=="+f.getPath());
     System.err.println("3=="+f.getCanonicalPath());
     System.err.println("1=========================================22222");*/
    }
   }
  } catch (SmbException e) {
   e.printStackTrace();
  }
  
  for (int i = 0; i < list.size(); i++) {
   System.err.println(list.get(i));
  }
 }

 /**
  * 方法四:把共享目录指定文件夹下的文件拷贝到另外一个共享目录指定文件夹下 (测试成功)
  *
  * @param rpath
  *            指定共享目录文件夹的路径一
  * @param rpath1
  *            指定共享目录文件夹的路径二
  * @throws IOException
  */
 private static void smbCopy(String rpath, String rpath1) throws IOException {
  // rpath =
  // "192.168.100.86/ybweatherweb/2-各类服务产品/1-气象信息快报/每日天气报告/"+yyyy+"/草稿/";
  // rpath1 =
  // "192.168.100.86/ybweatherweb/2-各类服务产品/1-气象信息快报/每日天气报告/"+yyyy+"/审核后/";
  String filename = "测试.docx";
  String username = "10086";
  String pwd = "10086";
  SmbFile f = new SmbFile("smb://" + username + ":" + pwd + "@" + rpath
    + filename);
  SmbFile f1 = new SmbFile("smb://" + username + ":" + pwd + "@" + rpath1);
  if (!f1.exists()) { // 目录文件夹不存在,就创建
   f1.mkdirs();
  }
  if (f.exists() && f.isFile()) {
   SmbFile fa1 = new SmbFile("smb://" + username + ":" + pwd + "@"
     + rpath1 + f.getName());
   f.copyTo(fa1);
  }
 }

 /**
  * 方法一: \\192.168.100.86\ybweatherweb\2-各类服务产品\23-专业服务产品\虎门部队\2017
  *
  * @param remoteUrl
  *            远程路径 smb://192.168.100.86/test/新建 文本文档.txt
  * @throws IOException
  */
 public static void smbGet1(String remoteUrl) throws IOException {
  SmbFile smbFile = new SmbFile(remoteUrl);
  int length = smbFile.getContentLength(); // 得到文件的大小
  byte buffer[] = new byte[length];
  SmbFileInputStream in = new SmbFileInputStream(smbFile);
  // 建立smb文件输入流
  while ((in.read(buffer)) != -1) {
   System.out.write(buffer); // 这个打印到控制台乱码,未解决;
   System.out.println(buffer.length);
  }
  in.close();
 }

 // 从共享目录下载文件
 /**
  * 方法二: 路径格式:smb://192.168.100.86/test/新建 文本文档.txt
  * smb://username:password@192.168.100.86/test
  *
  * @param remoteUrl
  *            远程路径
  * @param localDir
  *            要写入的本地路径
  */
 @SuppressWarnings("unused")
 public static void smbGet(String remoteUrl, String localDir) {
  InputStream in = null;
  OutputStream out = null;
  try {
   SmbFile remoteFile = new SmbFile(remoteUrl);
   if (remoteFile == null) {
    System.out.println("共享文件不存在");
    return;
   }
   String fileName = remoteFile.getName();
   File localFile = new File(localDir + File.separator + fileName);
   in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
   out = new BufferedOutputStream(new FileOutputStream(localFile));
   byte[] buffer = new byte[1024];
   while (in.read(buffer) != -1) {
    out.write(buffer);
    buffer = new byte[1024];
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    out.close();
    in.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

 // 删除共享目录中指定文件
 private static void smbDelete(String url) throws Exception {
  //String url = "smb://10086:10086@192.168.100.86/ybweatherweb/2-各类服务产品/23-专业服务产品/移动部门/2017/test.txt";
  SmbFile file = new SmbFile(url);
  if (file.exists()) {
   file.delete();
   System.out.println("删除文件成功!");
  }
 }

 // 向共享目录上传文件
 public static void smbPut(String remoteUrl, String localFilePath)
   throws Exception {
  String url_local = "F://test.txt";
  String URL_remote = "smb://10086:10086@192.168.100.86/2-各类服务产品/23-专业服务产品/移动部队/2017/test.txt";
  File localfile = new File(url_local);
  InputStream ins = new FileInputStream(localfile);
  SmbFile smbfile = new SmbFile(URL_remote);
  if (smbfile.exists()) {
   System.out.println("file is exists");
  } else {
   smbfile.connect();
   OutputStream outs = new SmbFileOutputStream(smbfile);
   byte[] buffer = new byte[4096];
   int len = 0; // 读取长度
   while ((len = ins.read(buffer, 0, buffer.length)) != -1) {
    outs.write(buffer, 0, len);
   }
   outs.flush(); // 刷新缓冲的输出流
   System.out.println("写入成功");
  }
  // 注意SmbFile本来就不稳定,一定要注意把所有的流关闭啊。try-catch挺烦的,用IDE自己生成吧!
 }
}
​//此文档属于转载文章,时间长了找不到原创连接,记录下来作为收藏,分享。非常感谢原创

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多