Java操作Windows10+共享⽂件SMBJ库的基本使⽤@[TOC](Java 操作Windows10+ 共享⽂件 SMBJ库的基本使⽤(读和写操作))
业务场景
使⽤它是因为客户要求⽹盘中能操作共享⽂件夹,但因为服务器是⼀台windows server2012+
貌似是不⽀持smb1协议,故⽽jcifs并不适⽤,⽬前Java实现的开源smb2/smb3库我到的只有SMBJ SMBJ
generic打印机简单的使⽤Demo
仅包含基本使⽤:读和写
1、创建会话
/**
* Windows10 已弃⽤smb1 需要使⽤SMBJ
*
* @author luotuan - Luotuan
* @version v1.0
* @date 2020/11/5
* @since v1.0
*/
@Configuration
public class RemoteFileForSMBV2 {
/**
* ip
**/
private final String hostName ="192.168.43.35";
/
**
* ⽬标⽤户名(如需密码则填写上即可此处可以@Value写到配置⽂件中)
**/
private final String username ="";
/**
* 密码
**/
private final String password ="";
@Bean(name ="Smb2Session")
public Session getSmb2Session(){
// String hostName = "192.168.1.106";
Session s = null;
try{
SMBClient client =new ateDefaultConfig());
Connection c = t(hostName);
System.out.println("是否链接:"+ c.isConnected());
s = c.authenticate(new AuthenticationContext(username, CharArray(),""));
return s;
}catch(IOException e){
e.printStackTrace();
}
return s;
}
2、实现简单的读写
接⼝:
/**
* 磁盘共享接⼝
*
* @author luotuan - Luotuan
* @version v1.0
* @date 2020/11/5
* @since v1.0
*/
public interface DiskShareHandleInterface {
List<String>listByShareName(String shareName);
boolean writeFile(String shareName, String filePath)throws IOException;
}
实现类:
/**
* 读写操作
*
* @author luotuan - Luotuan
* @version v1.0
* @date 2020/11/5
* @since v1.0
*/
@Component
public class HandleDiskShare implements DiskShareHandleInterface {
@Resource(name ="Smb2Session")
private Session session;
@Override
public List<String>listByShareName(String shareName){
ArrayList<String> strings =new ArrayList<>();
// 这块官⽅有⽰例
DiskShare share =(DiskShare) tShare(shareName);
List<FileIdBothDirectoryInformation> list = share.list("");
for(FileIdBothDirectoryInformation information : list){
strings.FileName());
}
return strings;
}
@Override
public boolean writeFile(String shareName, String filePath)throws IOException {
// filePath = shareName + filePath;
DiskShare share =(DiskShare) tShare(shareName);
File f = null;
int idx = filePath.lastIndexOf("/");
String folder ="";
String onlyFileName = filePath.substring(idx +1, filePath.length());
if(idx >-1){
folder = filePath.substring(0, idx);
}
// ⽂件不存在则创建,存在则打开。
try{
System.out.println(folder + java.io.File.separator + onlyFileName);
f = share.openFile(folder + onlyFileName,new HashSet(
Arrays.asList(new AccessMask[]{AccessMask.GENERIC_ALL})),
(Set) null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_CREATE,
(Set) null);
}catch(SMBApiException e){
// 此处取了个巧,捕获了其⽂件已存在时抛出的异常
Message().contains("STATUS_OBJECT_NAME_COLLISION")){
System.out.println("⽂件已经存在执⾏打开操作");
System.out.println(folder + java.io.File.separator + onlyFileName);
f = share.openFile(folder + onlyFileName,new HashSet(
Arrays.asList(new AccessMask[]{AccessMask.GENERIC_ALL})),
Arrays.asList(new AccessMask[]{AccessMask.GENERIC_ALL})),
(Set) null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OVERWRITE,
(Set) null);
}
}
OutputStream outputStream = null;
String str ="Hello World";
if(f != null){
outputStream = f.getOutputStream();
outputStream.Bytes());
outputStream.flush();
outputStream.close();
System.out.println("写下了⽂件");
}
return true;
}
}
在controller中调⽤
@RestController
@RequestMapping("/api/test/share")
public class HelloController {
@Autowired
private DiskShareHandleInterface handle;
@GetMapping("/list")
public List<String>listDis(String shareName){
return handle.listByShareName(shareName);
}
@PostMapping("/write")
public boolean listDis(@RequestBody TestPara testPara){
try{
return handle.ShareName(), FilePath());
}catch(IOException e){
e.printStackTrace();
}
return false;
}
}
⾮常简单的⼀个demo
记录下,SMB2CreateDisposition⾥⾯是些⽂件操作的枚举。
其操作有如下这些:
import com.hierynomus.protocolmons.EnumWithValue;
/**
* [MS-SMB2].pdf 2.2.13 SMB2 CREATE请求 - createDisposition会
*定义是否是在名称字段中指定的⽂件已经存在,服务器必须采取的⾏动。对于开放的命名管道,该字段可以被设置为客户端的任何值,并且必须由服务器忽略。对于其他⽂件,该字段必须包含下列值之⼀。
*/
public enum SMB2CreateDisposition implements EnumWithValue<SMB2CreateDisposition>{
/**
* 如果该⽂件已经存在,它取代。否则,创建该⽂件。此值不应该被⽤于打印机对象
*/
FILE_SUPERSEDE(0x00000000L),
/**
* 如果该⽂件已经存在,返回成功; 否则,操作失败。绝不能⽤于打印机对象
*/
FILE_OPEN(0x00000001L),
/**
* 如果该⽂件已经存在,操作失败; 否则,创建该⽂件。
*/
FILE_CREATE(0x00000002L),
/**
* 打开该⽂件,如果它已经存在; 否则,创建该⽂件。此值不应该被⽤于打印机对象
*/
FILE_OPEN_IF(0x00000003L),
/**
* 覆盖该⽂件,如果它已经存在; 否则,操作失败。绝不能⽤于打印机对象。
*/
FILE_OVERWRITE(0x00000004L),
/**
* 覆盖该⽂件,如果它已经存在; 否则,创建该⽂件。此值不应该被⽤于打印机对象。
*/
FILE_OVERWRITE_IF(0x00000005L);
private long value;
SMB2CreateDisposition(long value){
this.value = value;
}
public long getValue(){
return value;
}
}
参考着酌情使⽤吧。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论