前言:最近有个需求要读取NAS中的数据,NAS是以共享文件夹的形式来提供数据的,需要通过java来调用,最开始使用的jcifs,后来发现jcfis只支持smb1协议,而NAS提供的数据要用smb2或者smb3协议来读取,最后只能使用smbj来读取了,但可惜的是,smbj中没有提供列出文件夹或者文件全路径的接口,这么简单的方法都没有,实在是太坑爹了,无奈之下,自己拓展了一个。

1 引用smbj

    <dependency><groupId>com.hierynomus</groupId><artifactId>smbj</artifactId><version>0.10.0</version></dependency>

2 调用

   @RequestMapping("/ReadNasFepk")@ResponseBodypublic void ReadNasFepk() throws IOException {SMBClient client = new SMBClient();//从配置文件读取用户名密码等InputStream inStream = new FileInputStream(new File(resource));Properties properties = new Properties();properties.load(inStream);String SHARE_DOMAIN = "domain";//固定值,无需改动String SHARE_USER = properties.getProperty("user");//用户名String SHARE_PASSWORD = properties.getProperty("pwd");//密码String SHARE_SRC_DIR = properties.getProperty("dir");//共享的文件夹名String ip = properties.getProperty("ip");//ip 如:123.123.123.123Map<String,String> map=new HashMap<>();try {Connection connection = client.connect(ip);AuthenticationContext ac = new AuthenticationContext(SHARE_USER, SHARE_PASSWORD.toCharArray(), SHARE_DOMAIN);Session session = connection.authenticate(ac);// 连接共享文件夹DiskShare share = (DiskShare) session.connectShare(SHARE_SRC_DIR);String fatherPath=share.getSmbPath().toString().replace("\\","/");String sharePath="";// 遍历文件列表,查找指定文件类型ReadNasFepkRecurisive(fatherPath,sharePath,map,share);infoLogger.info(map);} catch (Exception e) {System.out.println(e.getMessage());}}//递归调用public void ReadNasFepkRecurisive(String fatherPath,String sharePath,Map<String,String> map,DiskShare share){//share.list("");即可列出文件夹下所有的文件夹和文件//share.list("北京");即可列出北京文件夹下所有的文件夹和文件//share.list("北京\朝阳区");即可列出北京\朝阳区文件夹下所有的文件夹和文件List<FileIdBothDirectoryInformation> list=share.list(sharePath);for (FileIdBothDirectoryInformation file : list) {String filename=file.getFileName();if (".".equals(filename) || "..".equals(filename)) {continue;}if (EnumWithValue.EnumUtils.isSet(file.getFileAttributes(), FileAttributes.FILE_ATTRIBUTE_DIRECTORY)) {//说明是文件夹String sonPath=fatherPath+"/"+filename;//下一级路径sharePath= sharePath=="" ? filename : sharePath+"\\"+filename;//递归读取ReadNasFepkRecurisive(sonPath,sharePath,map,share);//读取完后恢复上一级路径if(sharePath.lastIndexOf("\\")!=-1){sharePath=sharePath.substring(0,sharePath.lastIndexOf("\\"));}else{sharePath="";}}else{//说明是文件if(filename.endsWith(".fepk")){//全路径String path=fatherPath+"/"+filename;//文件名String name=filename.replace(".fepk","");map.add(name,path);infoLogger.info(name);infoLogger.info(path);}}}
}

3 总结

  感觉smbj这个库没有jcfis好用,jcfis也有支持smb2smb3协议的拓展库,叫做jcfis-ng,有空再研究吧,smbj不知是否可以在linux上用,因为它的文件夹分隔符使用的是“\”不是“/”,目前我只在windows上进行了测试,这个问题就留着有志之士解答吧。

smbj使用smb2及smb3协议遍历文件夹或者文件的方法相关推荐

  1. smbclient java,Java使用SMBJ包从仅支持SMB2/SMB3协议的共享文件夹下载文件

    说明 之前整理了一篇jcifs不能用于SMB2/SMB3机器的解决方式,其中提到了将jcifs包替换为smbj的方式解决,给出的下载的demo中虽然可以正常列出共享文件夹中的文件,但是具体怎样将共享文 ...

  2. python 遍历文件夹和文件

    文件结构如下图 path = r"文件夹1" 遍历1层下的所有文件名和文件夹名 import os fileList = os.listdir(path) # 遍历1层 print ...

  3. java读取hdfs文件夹_HDFS 读取、写入、遍历文件夹获取文件全路径、append

    1.从HDFS中读取数据 Configuration conf = getConf(); Path path = new Path(pathstr); FileSystem fs = FileSyst ...

  4. VBA遍历文件夹下文件文件实用源码

    '批量遍历文件夹下某类文件,并统计编号 Sub OpenAndClose()Dim MyFile As StringDim s As StringDim count As IntegerMyFile ...

  5. [C#(WebForm)] - 利用递归遍历文件夹和文件存入TreeView

    主要函数:(具体实例在下面) //必须先引用命名空间:System.IO //使用relateTreeView函数时 path 路径使用本地路径,或经过Server.MapPath("服务器 ...

  6. python修改文件后缀_python实现遍历文件夹修改文件后缀

    本文实例为大家分享了python实现遍历文件夹修改文件后缀的具体代码,供大家参考,具体内容如下 用法 python Modifer.py ./ -fp java xml # coding:utf-8 ...

  7. php文件遍历类,PHP 遍历文件夹及文件类及处理类

    FindFile.class.php 用于遍历目录文件 /** 遍历文件夹及文件类 * Date: 2013-03-21 * Author: fdipzone * Ver: 1.0 */ class ...

  8. 利用递归遍历文件夹和文件存入TreeView

    主要函数:(具体实例在下面) //必须先引用命名空间:System.IO //使用relateTreeView函数时 path 路径使用本地路径,或经过Server.MapPath("服务器 ...

  9. php遍历文件夹下文件内容_php实现的遍历文件夹下所有文件,编辑删除

    遍历文件夹; 功能:(a)可删除文件 (b)可编辑文本,网页文件 (c)可删除文件夹,前提是该文件夹为空 (d)可建立文件,文件夹,修改文件夹名称 /* 遍历文件夹; 功能:(a)可删除文件 (b)可 ...

最新文章

  1. 函数 —— popen() fscanf() sprintf() 执行shell命令并获取结果
  2. Python字符串、时间戳、datetime时间相关转换
  3. java匿名启动线程_用java实现匿名内部类启动线程
  4. 数据处理奇技巧——python数据处理小技能
  5. HashMap+双向链表实现LRU
  6. 简单人物画像_天天谈【用户画像】95%的人根本不知道自己在说什么
  7. python中文读音-python3 - 文本读音器
  8. Tuxera Ntfs for mac内核扩展批准不了怎么办 手动批准mac内核扩展
  9. Ubuntu安装Oracle手册(简单版)
  10. 南方cass字体样式设置_cass改变字体格式 cass字体样式管理器
  11. 《SRE:Google运维解密》读后有感
  12. 程序员,如何做好工作复盘?
  13. 数据结构与算法Python版之北大慕课笔记(五)
  14. win10点文件夹转圈圈假死机
  15. ARM的商业模式和ARM各种版本号区分
  16. 数据库为啥查询那么慢?
  17. CC0与商业IP:哪个更好?
  18. 大白话之 Iptables
  19. 怎么用xshell等ssh连接方式连接自己的本地虚拟机
  20. MYC编译器源码之代码生成

热门文章

  1. 【IOS】iOS开发常用三方库、插件、知名博客等等
  2. Halcon中Connection算子的说明
  3. Visual Studio 2012之“解决方案资源管理器”靠左靠右
  4. 使用第三方安装程序将Windows桌面应用打包
  5. springboot项目访问首页时返回jsp源码
  6. 钧道博物馆——022号藏品元早期钧窑红斑长颈瓶
  7. 正则表达式对象和RegExp对象
  8. USBCNC连接和设置MPG电子脉冲手轮?
  9. explain mysql怎么用_mysql中explain用法详解
  10. 引领网页设计潮流的优秀网页作品赏析《第四季》