windows系统之间SMB共享文件夹的访问和操作

windows系统之间SMB共享文件夹的访问和操作

前提背景:A系统与B系统的集成,A提交相关数据到B系统,数据格式为XML,XML标签中放着物理文件的访问路径,因A系统不能对外开发共享目录,B系统提供可访问操作的共享路径。

JCIFS使用

API中提供了实例说明,慢慢玩。

import jcifs.smb.*;

jcifs.Config.setProperty( "jcifs.netbios.wins", "192.168.1.220" );
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain", "username", "password");
SmbFileInputStream in = new SmbFileInputStream("smb://host/c/My Documents/somefile.txt", auth);
byte[] b = new byte[8192];
int n;
while(( n = in.read( b )) > 0 ) {
    System.out.write( b, 0, n );
}

示例

这里采用了设置相关参数的用法,因为共享机器中用户密码包含@这样不能直接拼接path url。

区别点,从共享那里取文件SmbFileInputStream,向共享那里送文件SmbFileOutputStream

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

public class SMBUtil {

	static NtlmPasswordAuthentication auth;
	static {
		//先祭天,如果不加,访问时长8秒起步,加快访问共享目录的速度
		Config.setProperty("jcifs.netbios.wins", "共享目录IP(0.0.0.0)");
		Config.setProperty("jcifs.netbios.domain", "共享目录所在域");
		Config.setProperty("jcifs.netbios.username", "共享目录用户名");
		Config.setProperty("jcifs.netbios.password", "共享目录用户密码");
		Config.setProperty("jcifs.smb.client.dfs.disabled", "true");
		System.setProperty("jcifs.smb.client.dfs.disabled", "true");
		auth = new NtlmPasswordAuthentication("域名", "用户名", "密码");
	}
	/**
	 * 从共享目录下获取文件
	 * @param sharedPathURL
	 * @param auth
	 */
	public static void smbGet(String sharedPathURL, NtlmPasswordAuthentication auth) {
		// 共享路径需要处理一下:形如   smb://10.10.10.10/a
		String url = sharedPathURL.replaceAll("\\\\", "/");
		SmbFileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			SmbFile smbFile = new SmbFile(url, auth);
			if (smbFile.isFile()) {
				fis = new SmbFileInputStream(smbFile);
				fos = new FileOutputStream(new File(smbFile.getName()));
				byte[] buff = new byte[1024*1024];
				int len;
				while((len = fis.read(buff))!=-1) {
					fos.write(buff, 0, len);
				}
				fos.flush();
			}else {
				SmbFile[] listFiles = smbFile.listFiles();
				for (SmbFile file : listFiles) {
					fis = new SmbFileInputStream(file);
					fos = new FileOutputStream(new File(file.getPath()));//这里需要定义文件存储的本地路径
					byte[] buff = new byte[1024*1024];
					int len;
					while((len = fis.read(buff))!=-1) {
						fos.write(buff, 0, len);
					}
					fos.flush();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 将本地物理文件上传至共享目录中
	 * @param sharedPathURL 共享目录的访问地址,类似:\\10.10.10.10\a
	 * @param files			需要上传到共享目录的本地文件列表
	 * @param timetamp		在时间戳在共享目录中创建文件夹用来区分记录
	 * @param auth			访问共享目录的认证
	 * @return				文件上传到共享目录之后,需要重新生成路径写入xml中,方便对方访问共享目录中的文件
	 */
	public static List<String> smbPut(String sharedPathURL, List<File> files, String timetamp, NtlmPasswordAuthentication auth) {
		// 共享路径需要处理一下:形如   smb://10.10.10.10/a
		String url = sharedPathURL.replaceAll("\\\\", "/");
		List<String> lists = new ArrayList<String>();
		FileInputStream fis = null;
		SmbFileOutputStream fos =null;
		SmbFile folder = null;
		if (null == files || files.size() == 0) {
			return null;
		}
		try {
			for (File file : files) {
				String filename = file.getName();
				//创建文件夹
				folder = new SmbFile(url+"/"+timetamp+"/", auth);
				if(!folder.exists()) folder.mkdirs();
				//创建文件
				SmbFile smbFile = new SmbFile(folder, filename);
				//正常的IO文件复制
				fis = new FileInputStream(file);
				fos = new SmbFileOutputStream(smbFile);
				byte[] buff = new byte[1024*1024];
				int len = 0;
				while((len=fis.read(buff))!=-1) {
					fos.write(buff, 0, len);
				}
				fos.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		try {
			SmbFile[] smbFiles = folder.listFiles();
			if (null != smbFiles && smbFiles.length > 0) {
				for (SmbFile smbFile : smbFiles) {
					String path = smbFile.getPath();
					lists.add(path.split(":")[1].replaceAll("/", "\\\\"));
				}
			}
		} catch (SmbException e) {
			e.printStackTrace();
		}
		return lists;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值