1、添加依赖

          <dependency><groupId>jcifs</groupId><artifactId>jcifs</artifactId><version>1.3.17</version></dependency>

2、示例工具类

import jcifs.smb.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.util.CollectionUtils;import java.io.*;
import java.net.MalformedURLException;
import java.util.*;/*** 共享盘操作工具类*/
@Slf4j
public class SmbFileUtils {/*** 递归获取共享盘某个目录下的文件列表** @param container* @param dir* @return* @throws SmbException*/public static void listSmbFilesByPrefixAndSuffix(List<SmbFile> container, SmbFile dir,String filePrefix, String fileSuffix) throws SmbException {SmbFile[] files = dir.listFiles();Arrays.stream(files).forEach(smbFile -> {try {if (smbFile.isDirectory()) {listSmbFilesByPrefixAndSuffix(container, smbFile, filePrefix, fileSuffix);} else {String fileName = smbFile.getName();if (fileName.contains(filePrefix) && fileName.endsWith(fileSuffix.toLowerCase())) {container.add(smbFile);}}} catch (SmbException e) {e.printStackTrace();}});}/*** 根据规则递归获取共享盘某个目录下的文件** @param sharedPath* @return* @throws SmbException*/public static List<String> listFileBySuffixAndLastSyncTime(String username, String password,String sharedPath, String fileSuffix,String lastSyncTime) throws Exception {sharedPath = tailWrap(sharedPath);NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);SmbFile dir = new SmbFile(sharedPath, auth);dir.connect();if (!dir.exists() || !dir.isDirectory()) {throw new Exception(sharedPath + "路径不存在!");}List<SmbFile> files = new ArrayList<>();//从指定目录开始获取目录下所有文件recursiveDir(files, dir);List<String> result = new ArrayList<>();try {if (!CollectionUtils.isEmpty(files)) {String finalSharedPath = sharedPath;files.forEach(file -> {String name = file.getName();boolean condition = false;try {condition = name.endsWith(fileSuffix.toLowerCase()) && CalendarUtil.lastModifiedBetween(file.lastModified(), lastSyncTime, CalendarUtil.getCurrentYMDHMS());} catch (SmbException e) {e.printStackTrace();}if (condition) {//获取相对于指定路径的文件名String fileNameWithRelativePath = file.getPath().substring(finalSharedPath.length() - 1);result.add(fileNameWithRelativePath);}});}} catch (Exception e) {e.printStackTrace();return Collections.emptyList();}log.info("满足配置要求的文件数量为:->{}", result.size());return result;}/*** 根据规则遍递归遍历文件夹中的文件** @param sharedPath* @param prefix       文件前缀* @param suffix* @param lastSyncTime* @return* @throws Exception*/public static List<String> listFileByPrefixAndSuffixAndLastSyncTime(String username, String password,String sharedPath, String prefix,String suffix, String lastSyncTime) throws Exception {sharedPath = tailWrap(sharedPath);String currentTime = CalendarUtil.getCurrentYMDHMS();NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);SmbFile dir = new SmbFile(sharedPath, auth);dir.connect();if (!dir.exists() || !dir.isDirectory()) {throw new Exception(sharedPath + "路径不存在!");}List<SmbFile> files = new ArrayList<>();recursiveDir(files, dir);List<String> result = new ArrayList<>();if (!CollectionUtils.isEmpty(files)) {String finalSharedPath = sharedPath;files.forEach(file -> {String name = file.getName();boolean condition = false;try {condition = name.contains(prefix) && name.endsWith(suffix.toLowerCase()) && CalendarUtil.lastModifiedBetween(file.lastModified(), lastSyncTime, currentTime);} catch (SmbException e) {e.printStackTrace();}if (condition) {String fileNameWithRelativePath = file.getPath().substring(finalSharedPath.length() - 1);result.add(fileNameWithRelativePath);}});}log.info("满足配置要求的文件数量为:->{}", result.size());return result;}/*** 根据规则遍递归遍历文件夹中的文件** @param sharedPath* @param prefix         文件前缀* @param suffix* @param fileTimeFormat* @return* @throws Exception*/public static List<String> listFileByPrefixAndSuffixAndTime(String username, String password,String sharedPath, String prefix,String suffix, String fileTimeFormat) throws Exception {sharedPath = tailWrap(sharedPath);NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);SmbFile dir = new SmbFile(sharedPath, auth);dir.connect();if (!dir.exists() || !dir.isDirectory()) {throw new Exception(sharedPath + "路径不存在!");}List<SmbFile> files = new ArrayList<>();recursiveDir(files, dir);List<String> result = new ArrayList<>();if (!CollectionUtils.isEmpty(files)) {String finalSharedPath = sharedPath;files.forEach(file -> {String name = file.getName();boolean condition = name.contains(prefix) && name.endsWith(suffix.toLowerCase()) && name.contains(fileTimeFormat);if (condition) {String fileNameWithRelativePath = file.getPath().substring(finalSharedPath.length());result.add(fileNameWithRelativePath);}});}log.info("满足配置要求的文件数量为:->{}", result.size());return result;}/*** 递归获取目录下的文件列表** @param list* @param dir* @return*/private static void recursiveDir(List<SmbFile> list, SmbFile dir) throws SmbException {SmbFile[] smbFiles = dir.listFiles();log.info("正在遍历的共享(SMB)文件夹为:->{}", dir.getPath());Arrays.stream(smbFiles).forEach(smbFile -> {try {if (smbFile.isDirectory()) {recursiveDir(list, smbFile);} else if (smbFile.isFile()) {list.add(smbFile);}} catch (SmbException e) {e.printStackTrace();}});}/*** 上传文件到共享盘** @param aimDir* @param fileName* @param inputStream* @return*/public static boolean upload(String username, String password,String aimDir, String fileName,InputStream inputStream) {try {//检查文件名字是否携带目录层级File file = new File(fileName);String parent = file.getParent();if (Objects.isNull(parent)) {parent = "/";}if (parent.contains("\\")) {parent = parent.replace("\\\\", "/");}if (!aimDir.endsWith("/") && !parent.startsWith("/")) {aimDir = aimDir + "/";}String desDir = aimDir + parent;if (!desDir.endsWith("/")) {desDir += "/";}if (!createDir(username, password, desDir)) {throw new RuntimeException("文件夹创建失败!->" + desDir);}NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);SmbFile aimFile = new SmbFile(desDir + file.getName(), auth);aimFile.connect();if (aimFile.isFile() && aimFile.exists()) {aimFile.delete();}aimFile.createNewFile();if (inputStream == null) {throw new Exception(fileName + "的文件流为null!");}byte[] buffer = new byte[inputStream.available()];inputStream.read(buffer);OutputStream outStream = new SmbFileOutputStream(aimFile);outStream.write(buffer);inputStream.close();outStream.close();} catch (Exception e) {e.printStackTrace();return false;}return true;}public static boolean createDir(String username, String password, String path) {try {NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);SmbFile smbFileDir = new SmbFile(path, auth);smbFileDir.connect();boolean flag = smbFileDir.exists();if (flag) {return true;}smbFileDir.mkdirs();log.info("目录:{},创建成功!", path);return true;} catch (MalformedURLException e) {e.printStackTrace();return false;} catch (SmbException e) {e.printStackTrace();return false;} catch (IOException e) {e.printStackTrace();return false;}}/*** 获取文件流** @param smbDir* @return* @throws IOException*/public static InputStream getFileInputStream(String username, String password, String smbDir, String fileName) {SmbFileInputStream fis = null;byte[] bytes = null;try {NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);if (!smbDir.endsWith("/") && !fileName.startsWith("/")) {SmbFile smbFile = new SmbFile(smbDir + "/" + fileName, auth);fis = new SmbFileInputStream(smbFile);bytes = IOUtils.toByteArray(fis);fis.close();InputStream inputStream = new ByteArrayInputStream(bytes);return inputStream;} else {SmbFile smbFile = new SmbFile(smbDir + fileName, auth);fis = new SmbFileInputStream(smbFile);bytes = IOUtils.toByteArray(fis);fis.close();InputStream inputStream = new ByteArrayInputStream(bytes);return inputStream;}} catch (Exception e) {e.printStackTrace();return null;}}/*** 删除文件** @param smbDir* @return* @throws IOException*/public static boolean deleteFile(String username, String password, String smbDir, String fileName) throws IOException {try {NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", username, password);if (!smbDir.endsWith("/") && !fileName.startsWith("/")) {SmbFile smbFile = new SmbFile(smbDir + "/" + fileName, auth);if (smbFile.isFile() && smbFile.exists()) {smbFile.delete();}} else {SmbFile smbFile = new SmbFile(smbDir + fileName, auth);if (smbFile.isFile() && smbFile.exists()) {smbFile.delete();}}return true;} catch (MalformedURLException e) {e.printStackTrace();return false;} catch (SmbException e) {e.printStackTrace();return false;}}private static String tailWrap(String tail) {if (!tail.endsWith("/")) {tail += "/";}return tail;}
}

注意事项:
①路径必须是smb://开头且以“/”结束 如 smb://127.0.0.1/D$/shareDisk/
②如果操作windows上的某个共享磁盘,若该磁盘没有指定共享名,须使用盘符加$代替,如操作D盘,路径里面不能写为D:\\ 应为"D$" 如 smb://127.0.0.1/D$/shareDisk/

SMB 协议操作共享盘相关推荐

  1. 使用window的SMB协议实现局域网文件传输——java版

    前言 简述一下SMB协议 SMB(Server Message Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议 ...

  2. 利用SMB协议实现局域网内设备文件的共享

    文章目录 参考资料 说明 步骤1:[windows]开启SMB协议 步骤2:[windows]创建新的用户账号 步骤3:[windows]共享文件夹 属性-共享-共享 属性-共享-高级共享 步骤4:[ ...

  3. Smb协议实现内网共享目录文件处理及踩坑记录

    Smb协议实现内网共享目录文件处理及踩坑记录 一.业务场景 公司内网环境,有部分比较古老的业务数据保存在一台windows服务器的共享目录里面.现在需要操作这个windows服务器的共享目录来上传下载 ...

  4. android盒子共享,Android使用SMB协议共享电脑内文件方法

    SMB协议是什么?SMB协议有什么用?SMB是一种网络通信协议,使用SMB协议可以实现不同类型设备之间数据传递.例如,文件.打印机共享也是基于这个协议.在Android平台我们最常使用的是用手机.平板 ...

  5. debian11安装samba(smb)协议的网络共享

    简介 SMB(Server Message Block)通信协议是微软和英特尔在1987年制定的协议,主要是作为Microsoft网络的通讯协议,它是当今世上网络文件系统协议两极之一的存在 Samba ...

  6. smb协议只能在同一网段吗_跨网段使用SMB共享服务

    环境说明 网段1:192.168.0.0/24 网段2:192.168.1.0/24 两个网段之间可以使用IP地址进行互相访问.但是无法使用主机名(HostName)访问. 处理过程 问题原因 直接使 ...

  7. 使用OpenFiler来模拟存储配置RAC中ASM共享盘及多路径(multipath)的测试

    第一章 本篇总览 之前发布了一篇<Oracle_lhr_RAC 12cR1安装>,但是其中的存储并没有使用多路径,而是使用了VMware自身提供的存储.所以,年前最后一件事就是把多路径学习 ...

  8. 基于SMB协议的共享文件读写 博客分类: Java

    基于SMB协议的共享文件读写 博客分类: Java 一.SMB协议 SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445. 服务器信息块(SMB)协议是一种IBM协议,用于在计算机 ...

  9. 开始协议处理句柄_基于smb协议的wmiexec浅析

    前言 之前研究过Crackmapexec这款工具,对这个工具基于smb协议的wmiexec执行方法产生的流量进行了分析,网上似乎还没有相关的文章,这里旨在抛砖引玉,简单梳理下整个过程,以初学者的视角, ...

最新文章

  1. 信号转换| 如何使用模拟电路完成对方波信号倍频PWM转换?
  2. 通过Loadruner对mysql数据库进行增删改查
  3. ffmpeg 0.8.11 VC编译的SDK已经发布
  4. R开发(part4)--分布检验与R语言
  5. linux cp后文件变大,使用 rsync 复制大文件的一些误解 | Linux 中国
  6. 【英语学习】【科学】【Glencoe Science】【D】Human Body Systems 目录及术语表
  7. LNMP下wordpress无法切换主题,只显示当前主题解决方法
  8. 公众号文章批量导出工具
  9. [C#]文件中转站程序及源码
  10. php mvc cms企业站,HongCMS中英文企业网站系统
  11. VMware Workstation 12 Pro的安装
  12. 12306验证码识别初尝试(1)
  13. C语言中%d %.2d %2d %02d的区别
  14. 上海汉枫电子推出能“听”会“说”的物联网Wi-Fi模块
  15. AGE-PERIOD-COHORT (APC) 连续变量和二分类变量分析全代码
  16. 缺失MSVCR120.dll文件
  17. html 设置元素向左浮动
  18. Proxy SwitchyOmega
  19. 查看php错误日志文件,php错误日志怎么看
  20. 【Nordic】使用nRF52810常见问题

热门文章

  1. 从猎豹移动到瑞幸咖啡,看中国企业在海外的信誉破产
  2. html表单灰色字,灰色HTML表单元素
  3. 私域流量sop社群运营规划工作计划表格方案模板2022
  4. JAVA的jdk1.8中文文档
  5. 技术内幕 | StarRocks Pipeline 执行框架(下)
  6. MFC中得到2个SYSTEMTIME时间差的函数
  7. tipask二次开发总结_tipask二次开发总结
  8. Espresso Idling Resource 使用
  9. 2021年化工自动化控制仪表考试题及化工自动化控制仪表考试试卷
  10. mongoDB数据库安装报错问题SocketException: Error connecting to和Shutting down