在上一篇文章中,实现了通过sqlite读取百度网盘的缓存数据库文件来读取百度网盘的目录了,但是数据库中的目录比较乱,我们用代码来实现一波整理,用来满足我们的需求
表分析
这个上面的是表的机构信息,通过数据分析,对我们比较有用的就是parent_path(上级目录地址),server_filename(当前目录名),isdir(是否是目录),category(文件类型)
目录分析
查找当前目录的位置:parent_path+server_filename and isdir=1
查找上面目录下面的文件:parent_path(新) = parent_path(上)+server_filename(上)+"/" and isdir != 1 这个新parent_path下面的所有记录就是上面目录下面的所有文件。
写代码
新建Springboot maven工程
我搭建的项目架构是Springboot+Mybaits+通用mapper,数据库驱动是用Druid
添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--sqlite连接驱动包-->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.25.2</version>
</dependency>
<!--通用mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
springboot+sqlite数据库驱动环境配置:
## Êý¾Ý¿â·ÃÎÊÅäÖÃ
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.datasource.url=jdbc:sqlite:D:\\temp\\BaiduYunCacheFileV0.db
spring.datasource.username=
spring.datasource.password=
# ÏÂÃæÎªÁ¬½Ó³ØµÄ²¹³äÉèÖã¬Ó¦Óõ½ÉÏÃæËùÓÐÊý¾ÝÔ´ÖÐ
# ³õʼ»¯´óС£¬×îС£¬×î´ó
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# ÅäÖûñÈ¡Á¬½ÓµÈ´ý³¬Ê±µÄʱ¼ä
spring.datasource.maxWait=60000
# ÅäÖüä¸ô¶à¾Ã²Å½øÐÐÒ»´Î¼ì²â£¬¼ì²âÐèÒª¹Ø±ÕµÄ¿ÕÏÐÁ¬½Ó£¬µ¥Î»ÊǺÁÃë
spring.datasource.timeBetweenEvictionRunsMillis=60000
# ÅäÖÃÒ»¸öÁ¬½ÓÔÚ³ØÖÐ×îСÉú´æµÄʱ¼ä£¬µ¥Î»ÊǺÁÃë
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 1 from sqlite_master
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# ´ò¿ªPSCache£¬²¢ÇÒÖ¸¶¨Ã¿¸öÁ¬½ÓÉÏPSCacheµÄ´óС
#spring.datasource.poolPreparedStatements=false
#spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# ÅäÖÃ¼à¿ØÍ³¼ÆÀ¹½ØµÄfilters£¬È¥µôºó¼à¿Ø½çÃæsqlÎÞ·¨Í³¼Æ£¬'wall'ÓÃÓÚ·À»ðǽ
spring.datasource.filters=stat,log4j
# ºÏ²¢¶à¸öDruidDataSourceµÄ¼à¿ØÊý¾Ý
#spring.datasource.useGlobalDataSourceStat=true
spring.datasource.loginusername=admin
spring.datasource.loginpassword=admin
#mybatis
mybatis.mapper-locations=classpath:cn/javabb/mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
#mappers ¶à¸ö½Ó¿Úʱ¶ººÅ¸ô¿ª
mapper.mappers=cn.javabb.common.BaseMapper
mapper.notEmpty=false
mapper.before=true
mapper.identity=sqlite
为cache_file创建一个实体,只用几个必要的属性,其他的可以不要,(省略Get,Set方法)
@Id
private Integer id;
private String parentPath;
private String serverFilename;
private Integer fileSize;
private String md5;
private Integer isdir;
private Integer category;
编写方法,根据目录名(全名)查找数据
<select id="listByParentPath" parameterType="String" resultType="cn.javabb.entity.CacheFile">
select id,parent_path,server_filename,file_size,isdir from cache_file where parent_path =#{pathName} order by isdir desc,server_filename asc
</select>
业务处理类:
参数1:folderName->目录名称
参数2:level->从目录下递归几层,当前目录为1层,目录下第一级为2层
@Service
public class CacheFileService {
@Autowired
CacheFileMapper cacheFileMapper;
public List<CacheFile> listByFolderName(String folderName,Integer level){
CacheFile floder = new CacheFile();
floder.setServerFilename(folderName);
floder.setIsdir(1);
List<CacheFile> floderList = cacheFileMapper.select(floder);
if(null!=floderList){
CacheFile floderNew = floderList.get(0);
List<CacheFile> menuList = cacheFileMapper.listByParentPath(floderNew.getParentPath()+floderNew.getServerFilename()+"/");
if(null == menuList){
System.out.println("资源目录为空");
return null;
}
for(CacheFile cf:menuList){
if(cf.getServerFilename().indexOf("下载必看")>-1&&cf.getIsdir()==0){
continue;
}
System.out.println(formatter(cf.getServerFilename()));
if(cf.getIsdir()==0){
}else{
if(level>1){
listByFolderName(cf.getServerFilename(),level-1);
}
}
}
}else{
System.out.println("资源找不到");
}
return null;
}
/**
* 过滤关键词
* @author QINB
* @param name
* @return
*/
public String formatter(String name){
String str = name.replace("[www.javadaba.com Java大巴]","")
.replace("【www.javadaba.com Java大巴】", "")
.replace("www.javadaba.com", "");
return str;
}
测试:
我自己测试了很多,目前没有啥子别的问题,向下递归也没有问题,无论多少层,只要设置好level你就可以递归到多少层。
项目源码:https://gitee.com/imqinbao/baiduYun
备注:在application.yml中将数据库文件用你自己的数据库文件。
我的博客地址:www.javabb.cn 博客开源地址:https://gitee.com/imqinbao/javabb_blog