通过jcifs.jar 操作局域网内另外一台机器的文件操作
来源:互联网 发布:linux 写脚本文件 编辑:程序博客网 时间:2024/06/12 01:30
前提:远程计算机在局域网内,并且开启共享磁盘权限!
例子1:
package com.project.remoteUrl;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
public class RemoteUrl {
//<><><><><><><><><><>注意jcifs-1.3.15.jar 需要 远程计算机在局域网内,并且开启共享磁盘权限!<><><><><><><>
/*
* Description: 从本地上传文件到共享目录
* @param remoteUrl 共享文件目录
* @param localFilePath 本地文件绝对路径
*/
public void smbPut(String remoteUrl,String localFilePath){
InputStream in = null;
OutputStream out = null;
try{
//创建file类 传入本地文件路径
File localFile = new File(localFilePath);
//获得本地文件的名字
String fileName = localFile.getName();
//将本地文件的名字和远程目录的名字拼接在一起
//确保上传后的文件于本地文件名字相同
SmbFile remoteFile = new SmbFile(remoteUrl+"/"+fileName);
//创建读取缓冲流把本地的文件与程序连接在一起
in = new BufferedInputStream(new FileInputStream(localFile));
//创建一个写出缓冲流(注意jcifs-1.3.15.jar包 类名为Smb开头的类为控制远程共享计算机"io"包)
//将远程的文件路径传入SmbFileOutputStream中 并用 缓冲流套接
out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));
//创建中转字节数组
byte[] buffer = new byte[1024];
while(in.read(buffer)!=-1){//in对象的read方法返回-1为 文件以读取完毕
out.write(buffer);
buffer = new byte[1024];
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//注意用完操作io对象的方法后关闭这些资源,走则 造成文件上传失败等问题。!
out.close();
in.close();
}catch(Exception e){
e.printStackTrace();}
}
}
/* 在本地为共享计算机创建文件夹
* @param remoteUrl 远程计算机路径
*/
public void smbMkDir(String remoteUrl){
try{
//注意使用jcifs-1.3.15.jar的时候 操作远程计算机的时候所有类前面须要增加Smb
//创建一个远程文件对象
SmbFile remoteFile = new SmbFile(remoteUrl+ File.separator + "123");
if(!remoteFile.exists()){
//创建远程文件夹
remoteFile.mkdir();
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
RemoteUrl test = new RemoteUrl();
//注意: 创建远程文件的远程文件路径需要按以下格式写。 如我的ip为172.16.50.38 我需要在d盘创建一个叫Scan6C的文件夹
test.smbMkDir("smb://172.16.50.38/d/Scan6C");
//如远程计算机有用户名和密码的限制的话 请按一下格式填写 smb://{user}:{password}@{host}/{path}
test.smbPut("smb://aaa:bb@172.16.50.38/Scan6C", "c://test.txt") ;
}
}
例子2:
1、配置文件:copyRemoteFile.properties
# src/dao.properties
# 这里保存的都是键值对信息
#
interface
name(no packgage) = implementation
class
# 注意:
# A:【路径符号】【必须】是【/】【如:D:/home/publish】
# B:【键key=值value】对【后面】【绝不允许有空格】【如:REMOTE_HOST_IP=
172.77
.
9.77
】
# REMOTE_HOST_IP 远程机器IP
# LOGIN_ACCOUNT 远程机器登录名
# LOGIN_PASSWORD 远程机器登录密码
# SHARE_DOC_NAME 远程机器共享文件夹名(设置共享后必须授予读写权限)
# sourcePath 本地路径
# targetPath 目标路径(真实路径=共享文件夹路径+目标路径)
REMOTE_HOST_IP=
172.77
.
9.77
LOGIN_ACCOUNT=
77
LOGIN_PASSWORD=
77
SHARE_DOC_NAME=vfs_home
sourcePath=D:/home/publish
targetPath=publish
2、导入jar包:jcifs-1.3.16.jar
3、读取配置文件中key对应的value类:RemoteConfigUtil.java
package
com.remote;
import
java.io.IOException;
import
java.util.Properties;
/**
* 读取配置文件中key对应的value
* @author JunjieQin
*/
public
class
RemoteConfigUtil {
private
String REMOTE_HOST_IP;
private
String LOGIN_ACCOUNT;
private
String LOGIN_PASSWORD;
private
String SHARE_DOC_NAME;
private
String sourcePath;
private
String targetPath;
//无参构造方法
public
RemoteConfigUtil() {
try
{
// 读取配置文件
Properties prop =
new
Properties();
prop.load(
this
.getClass().getClassLoader().getResourceAsStream(
"copyRemoteFile.properties"
));
// 根据 key 获取 value
REMOTE_HOST_IP = prop.getProperty(
"REMOTE_HOST_IP"
);
LOGIN_ACCOUNT = prop.getProperty(
"LOGIN_ACCOUNT"
);
LOGIN_PASSWORD = prop.getProperty(
"LOGIN_PASSWORD"
);
SHARE_DOC_NAME = prop.getProperty(
"SHARE_DOC_NAME"
);
sourcePath = prop.getProperty(
"sourcePath"
);
targetPath = prop.getProperty(
"targetPath"
);
}
catch
(IOException e) {
e.printStackTrace();
}
}
public
String getLOGIN_ACCOUNT() {
return
LOGIN_ACCOUNT;
}
public
void
setLOGIN_ACCOUNT(String login_account) {
LOGIN_ACCOUNT = login_account;
}
public
String getLOGIN_PASSWORD() {
return
LOGIN_PASSWORD;
}
public
void
setLOGIN_PASSWORD(String login_password) {
LOGIN_PASSWORD = login_password;
}
public
String getREMOTE_HOST_IP() {
return
REMOTE_HOST_IP;
}
public
void
setREMOTE_HOST_IP(String remote_host_ip) {
REMOTE_HOST_IP = remote_host_ip;
}
public
String getSHARE_DOC_NAME() {
return
SHARE_DOC_NAME;
}
public
void
setSHARE_DOC_NAME(String share_doc_name) {
SHARE_DOC_NAME = share_doc_name;
}
public
String getSourcePath() {
return
sourcePath;
}
public
void
setSourcePath(String sourcePath) {
this
.sourcePath = sourcePath;
}
public
String getTargetPath() {
return
targetPath;
}
public
void
setTargetPath(String targetPath) {
this
.targetPath = targetPath;
}
}
4、操作远程共享文件夹类: RemoteFileUtil.java
根据需求选择相应的 Method
package
com.remote;
import
java.io.BufferedOutputStream;
import
java.io.BufferedReader;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
java.io.OutputStream;
import
java.net.MalformedURLException;
import
java.net.UnknownHostException;
import
java.util.ArrayList;
import
java.util.List;
import
jcifs.smb.SmbException;
import
jcifs.smb.SmbFile;
import
jcifs.smb.SmbFileInputStream;
import
jcifs.smb.SmbFileOutputStream;
/***********************************************
* File Name: RemoteFileUtil.java
* Created by: JunjieQin
* Checked in by:
* Date: 2011-9-6
* Revision: 1.7
* Description:操作远程共享文件夹类
* Amendment History
* Modified Date:2011-9-16
* Modified By:JunjieQin
* Change Description:From local copy files to remote directory
*
***********************************************/
public
class
RemoteFileUtil {
private
ArrayList filelist =
new
ArrayList();
RemoteConfigUtil rc =
new
RemoteConfigUtil();
private
String remoteHostIp;
//远程主机IP
private
String account;
//登陆账户
private
String password;
//登陆密码
private
String shareDocName;
//共享文件夹名称
/**
* 默认构造函数
*/
public
RemoteFileUtil(){
this
.remoteHostIp = rc.getREMOTE_HOST_IP();
this
.account = rc.getLOGIN_ACCOUNT();
this
.password = rc.getLOGIN_PASSWORD();
this
.shareDocName = rc.getSHARE_DOC_NAME();
}
/**
* 构造函数
* @param remoteHostIp 远程主机Ip
* @param account 登陆账户
* @param password 登陆密码
* @param sharePath 共享文件夹路径
*/
public
RemoteFileUtil(String remoteHostIp, String account, String password,String shareDocName) {
this
.remoteHostIp = remoteHostIp;
this
.account = account;
this
.password = password;
this
.shareDocName = shareDocName;
}
/**
* 对远程共享文件进行读取所有行
* @param remoteFileName 文件名 说明:参数为共享目录下的相对路径
* 若远程文件的路径为:shareDoc\test.txt,则参数为test.txt(其中shareDoc为共享目录名称);
* 若远程文件的路径为:shareDoc\doc\text.txt,则参数为doc\text.txt;
* @return 文件的所有行
*/
public
List<String> readFile(String remoteFileName){
SmbFile smbFile =
null
;
BufferedReader reader =
null
;
List<String> resultLines =
null
;
//构建连接字符串,并取得文件连接
String conStr =
null
;
conStr =
"smb://"
+account+
":"
+password+
"@"
+remoteHostIp+
"/"
+shareDocName+
"/"
+remoteFileName;
try
{
smbFile =
new
SmbFile(conStr);
}
catch
(MalformedURLException e) {
e.printStackTrace();
}
//创建reader
try
{
reader =
new
BufferedReader(
new
InputStreamReader(
new
SmbFileInputStream(smbFile)));
}
catch
(SmbException e) {
e.printStackTrace();
}
catch
(MalformedURLException e) {
e.printStackTrace();
}
catch
(UnknownHostException e) {
e.printStackTrace();
}
//循环对文件进行读取
String line;
try
{
line = reader.readLine();
if
(line !=
null
&& line.length()>
0
){
resultLines =
new
ArrayList<String>();
}
while
(line !=
null
) {
resultLines.add(line);
line = reader.readLine();
}
}
catch
(IOException e) {
e.printStackTrace();
}
//返回
return
resultLines;
}
/**
* 对远程共享文件进行写入
* @param is 本地文件的输入流
* @param remoteFileName 远程文件名 说明:参数为共享目录下的相对路径
* 若远程文件的路径为:shareDoc\test.txt,则参数为test.txt(其中shareDoc为共享目录名称);
* 若远程文件的路径为:shareDoc\doc\text.txt,则参数为doc\text.txt;
* @return
*/
public
boolean
writeFile(InputStream is,String remoteFileName){
SmbFile smbFile =
null
;
OutputStream os =
null
;
byte
[] buffer =
new
byte
[
1024
*
8
];
//构建连接字符串,并取得文件连接
String conStr =
null
;
conStr =
"smb://"
+account+
":"
+password+
"@"
+remoteHostIp+
"/"
+shareDocName+
"/"
+remoteFileName;
try
{
smbFile =
new
SmbFile(conStr);
}
catch
(MalformedURLException e) {
e.printStackTrace();
return
false
;
}
//获取远程文件输出流并写文件到远程共享文件夹
try
{
os =
new
BufferedOutputStream(
new
SmbFileOutputStream(smbFile));
while
((is.read(buffer))!=-
1
){
os.write(buffer);
}
}
catch
(Exception e) {
e.printStackTrace();
return
false
;
}
return
true
;
}
/**
* 对远程共享文件进行写入重载
* @param localFileName 要写入的本地文件全名
* @param remoteFileName 远程文件名 说明:参数为共享目录下的相对路径
* 若远程文件的路径为:shareDoc\test.txt,则参数为test.txt(其中shareDoc为共享目录名称);
* 若远程文件的路径为:shareDoc\doc\text.txt,则参数为doc\text.txt;
* @return
*/
public
boolean
writeFile(String localFileFullName ,String remoteFileName){
try
{
return
writeFile(
new
FileInputStream(
new
File(localFileFullName)),remoteFileName);
}
catch
(FileNotFoundException e) {
e.printStackTrace();
return
false
;
}
}
/**
* 对远程共享文件进行写入重载
* @param localFileName 要写入的本地文件
* @param remoteFileName 远程文件名 说明:参数为共享目录下的相对路径
* 若远程文件的路径为:shareDoc\test.txt,则参数为test.txt(其中shareDoc为共享目录名称);
* 若远程文件的路径为:shareDoc\doc\text.txt,则参数为doc\text.txt;
* @return
*/
public
boolean
writeFile(File localFile ,String remoteFileName){
try
{
return
writeFile(
new
FileInputStream(localFile),remoteFileName);
}
catch
(FileNotFoundException e) {
e.printStackTrace();
return
false
;
}
}
/**
* 对远程共享文件所有文件
* @return 所有文件
*/
public
List<String> getFiles(){
SmbFile smbFile =
null
;
BufferedReader reader =
null
;
List<String> resultLines =
new
ArrayList();
//构建连接字符串,并取得文件连接
String conStr =
null
;
conStr =
"smb://"
+account+
":"
+password+
"@"
+remoteHostIp+
"/"
+shareDocName+
"/"
;
try
{
smbFile =
new
SmbFile(conStr);
}
catch
(MalformedURLException e) {
e.printStackTrace();
}
//创建reader
try
{
String[] a = smbFile.list();
for
(
int
i=
0
;i<a.length;i++){
resultLines.add(a[i]);
System.out.println(a[i]);
}
}
catch
(SmbException e) {
e.printStackTrace();
}
catch
(Exception e) {
e.printStackTrace();
}
//返回
return
resultLines;
}
/** 在本地为共享计算机创建文件夹
* @param remoteUrl 远程计算机路径
*/
public
void
smbMkDir(String name) {
// 注意使用jcifs-1.3.15.jar的时候 操作远程计算机的时候所有类前面须要增加Smb
// 创建一个远程文件对象
String conStr =
"smb://"
+ account +
":"
+ password +
"@"
+ remoteHostIp +
"/"
+ shareDocName;
SmbFile remoteFile;
try
{
remoteFile =
new
SmbFile(conStr +
"/"
+ name);
if
(!remoteFile.exists()) {
remoteFile.mkdir();
// 创建远程文件夹
}
}
catch
(MalformedURLException e) {
e.printStackTrace();
}
catch
(SmbException e) {
e.printStackTrace();
}
}
/**
* 删除文件夹
* @param folderPath 共享文件夹下一个文件夹名
* @return
*/
public
void
delFolder(String folderPath) {
//String conStr = "smb://"+LOGIN_ACCOUNT+":"+LOGIN_PASSWORD+"@"+remoteHostIp+"/"+shareDocName;
try
{
delAllFile(folderPath);
//删除完里面所有内容
String filePath = folderPath;
filePath = filePath.toString();
SmbFile myFilePath =
new
SmbFile(filePath);
myFilePath.delete();
//删除空文件夹
}
catch
(Exception e) {
String message = (
"删除文件夹操作出错"
);
System.out.println(message);
}
}
/**
* 删除共享文件夹下一个文件夹名
* @param path 共享文件夹下一个文件夹名
* @return
* @return
*/
public
boolean
delAllFile(String path) {
boolean
bea =
false
;
try
{
SmbFile file =
new
SmbFile(path);
if
(!file.exists()) {
return
bea;
}
if
(!file.isDirectory()) {
return
bea;
}
String[] tempList = file.list();
SmbFile temp =
null
;
for
(
int
i =
0
; i < tempList.length; i++) {
if
(path.endsWith(
"/"
)) {
temp =
new
SmbFile(path + tempList[i]);
}
else
{
temp =
new
SmbFile(path +
"/"
+ tempList[i]);
}
if
(temp.isFile()) {
temp.delete();
}
if
(temp.isDirectory()) {
delAllFile(path +
"/"
+ tempList[i] +
"/"
);
// 先删除文件夹里面的文件
delFolder(path +
"/"
+ tempList[i] +
"/"
);
// 再删除空文件夹
bea =
true
;
}
}
return
bea;
}
catch
(Exception e) {
return
bea;
}
}
/**
* 复制整个文件夹的内容
* @param oldPath 准备拷贝的目录
* @param newPath 指定绝对路径的新目录
* @return
*/
public
void
copyFolder(String oldPath, String newPath) {
String conStr =
"smb://"
+ account +
":"
+ password +
"@"
+ remoteHostIp +
"/"
+ shareDocName;
System.err.println(conStr);
try
{
/**
* 如果存在文件夹删除文件
* SmbFile exittemp = new SmbFile(conStr + "/"+newPath);
* if(exittemp.exists()){
* delFolder(conStr+"/"+newPath+"/");
* }
*/
SmbFile exittemps =
new
SmbFile(conStr +
"/"
+ newPath);
if
(!exittemps.exists()) {
exittemps.mkdirs();
// 如果文件夹不存在 则建立新文件夹
}
File a =
new
File(oldPath);
String[] file = a.list();
File temp =
null
;
for
(
int
i =
0
; i < file.length; i++) {
if
(oldPath.endsWith(
"/"
)) {
temp =
new
File(oldPath + file[i]);
}
else
{
temp =
new
File(oldPath +
"/"
+ file[i]);
}
if
(temp.isFile()) {
if
(temp.exists()) {
writeFile(temp, newPath +
"/"
+ file[i]);
}
}
if
(temp.isDirectory()) {
// 如果是子文件夹
copyFolder(oldPath +
"/"
+ file[i], newPath +
"/"
+ file[i]);
}
}
}
catch
(Exception e) {
String message =
"复制整个文件夹内容操作出错"
;
System.out.println(message);
}
}
/**
* 复制文件到远程计算机,如果目标路径不存在则创建,反之不创建
* @param localFileFullName 本地指定文件路径
* @param targetDir 目标路径
*/
public
void
copyFileToRemoteDir(String localFileFullName, String targetDir) {
System.err.println(localFileFullName +
"--"
+ targetDir);
RemoteFileUtil rf =
new
RemoteFileUtil();
InputStream is =
null
;
SmbFile smbFile =
null
;
OutputStream os =
null
;
byte
[] buffer =
new
byte
[
1024
*
8
];
// 构建连接字符串,并取得文件连接
String conStr =
null
;
conStr =
"smb://"
+ account +
":"
+ password +
"@"
+ remoteHostIp +
"/"
+ shareDocName +
"/"
+ targetDir;
System.err.println(conStr);
SmbFile sf;
try
{
sf =
new
SmbFile(
"smb://"
+ account +
":"
+ password +
"@"
+ remoteHostIp +
"/"
+ shareDocName +
"/"
+ targetDir);
if
(!sf.exists()) {
// 新建目标目录
sf.mkdirs();
is =
new
FileInputStream(
new
File(localFileFullName));
// 获取远程文件输出流并写文件到远程共享文件夹
os =
new
BufferedOutputStream(
new
SmbFileOutputStream(smbFile));
while
((is.read(buffer)) != -
1
) {
os.write(buffer);
}
}
}
catch
(Exception e) {
System.err.println(
"提示:复制整个文件夹内容操作出错。"
);
}
File file =
new
File(localFileFullName);
if
(file.isFile()) {
File sourceFile = file;
// 源文件
File targetFile =
new
File(
new
File(targetDir).getAbsolutePath() + File.separator + file.getName());
// 目标文件
String name = file.getName();
// 文件名
if
(targetDir !=
null
&& targetFile !=
null
) {
rf.writeFile(sourceFile,
"/"
+ targetDir +
"/"
+ name);
// 复制文件
}
else
if
(targetFile !=
null
) {
rf.writeFile(sourceFile, name);
// 复制文件
}
}
}
/**
* 循环获取文件夹内所有匹配的文件
* @param strPath 路径
* @param subStr 匹配字符
* @return
*/
public
ArrayList refreshFileList(String strPath, String subStr) {
File dir =
new
File(strPath);
File[] files = dir.listFiles();
if
(files ==
null
)
return
null
;
for
(
int
i =
0
; i < files.length; i++) {
if
(!files[i].isDirectory()) {
String strFileName = files[i].getAbsolutePath().toLowerCase();
if
(files[i].getName().indexOf(subStr) >=
0
) {
filelist.add(files[i].getName());
}
}
}
return
filelist;
}
// 测试从本地复制文件到远程目标目录,测试已通过
public
static
void
main(String[] args) {
RemoteConfigUtil rc =
new
RemoteConfigUtil();
RemoteFileUtil util =
new
RemoteFileUtil();
util.copyFileToRemoteDir(rc.getSourcePath(), rc.getTargetPath());
}
}
- 通过jcifs.jar 操作局域网内另外一台机器的文件操作
- java 读取另外一台局域网机器上的文件
- 如何通过doc访问另外一台机器的内容
- 把一个机器上1天内新增的文件用rsync传送到另外一台机器
- jcifs 文件共享操作
- 如何让局域网内的一台机器作web服务器
- 怎样使用局域网内的一台机器做为代…
- 局域网内的电脑,通过一台电脑(可上外网)链接外网记录
- 操作jar包内的资源文件方法,通过classLoader方式
- jar文件操作--获取jar包内的文件夹
- php访问局域网内机器的文件
- 两台机器共享文件操作
- 局域网中,把数台电脑上的文件,通过一台VSFTP服务器一起对外发布,有几种方法?
- 解决: 关于配置局域网内通过一台WEB服务器连接到域服务器进行身份验证的IP设置
- Linux下使用expect和另外一台机器通过SSH进行持续性交互
- 局域网内无法通过机器名访问共享的解决
- 请求乱码 一台机器行,另外一台不行
- 在linux下使用rsync将文件定时同步到另外一台机器
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
- SQL Update一条记录长达30秒
- 操纵市场(Market Manipulation) 内幕交易(Insider Trading)
- 部分博客的整理网址
- 关于Wince DataGrid 的当前选择行的问题
- 通过jcifs.jar 操作局域网内另外一台机器的文件操作
- C#.操作文件异常:文件正在使用中
- 关于EXEC执行SQL语句报错
- java office 转 html
- MD5加密算法,java实现
- Android学习:SQLite使用
- 一千零一夜
- tomcat配置管理员帐号密码
- android给图片加上倒影