**本人技术有限写的不好的地方敬请原谅,如有什么问题或者更好的建议大家可以留言或者私信**
前言
使用上一章节代码测试通过之后,我上传同一个文件然后再次删除系统就会抛出异常不可以删除文件,具体原因查询之后说是由于操作文件需要流有的没有关闭导致进程占用文件无法删除。我重启服务之后就可以删除。
1.上一章节删除文件链接
https://blog.csdn.net/weixin_45305953/article/details/108804679
2.修改服务端代码
(1)关闭流
上传文件时有四个接口,分别是上传注册,分块检查,上传分块,合并分块这四个方法中保证打开的流全部关闭,注意先打开的流最后关闭
(2)修改删除文件的代码
这里我们使用参考了这位博主的代码:https://blog.csdn.net/weixin_44365021/article/details/85950456
在项目中MediaFileService类中使用使用代码如下所示
//删除文件的三个私用方法
/**
* 判断指定的文件或文件夹删除是否成功
* @param fileName 文件或文件夹的路径
* @return true or false 成功返回true,失败返回false
*/
private boolean deleteAnyone(String fileName) {
File file = new File(fileName);//根据指定的文件名创建File对象
if ( !file.exists() ){ //要删除的文件不存在
log.error("文件"+fileName+"不存在,删除失败!" );
return false;
}else{ //要删除的文件存在
if ( file.isFile() ){ //如果目标文件是文件
return deleteFile(fileName);
}else{ //如果目标文件是目录
return deleteDir(fileName);
}
}
}
/**
* 判断指定的文件删除是否成功
* @param fileName 文件路径
* @return true or false 成功返回true,失败返回false
*/
private boolean deleteFile(String fileName){
File file = new File(fileName);//根据指定的文件名创建File对象
if ( file.exists() && file.isFile() ){ //要删除的文件存在且是文件
if ( file.delete()){
log.error("文件"+fileName+"删除成功!");
return true;
}else{
log.error("文件"+fileName+"删除失败!");
return false;
}
}else{
log.error("文件"+fileName+"不存在,删除失败!" );
return false;
}
}
/**
* 删除指定的目录以及目录下的所有子文件
* @param dirName is 目录路径
* @return true or false 成功返回true,失败返回false
*/
private boolean deleteDir(String dirName){
if ( dirName.endsWith(File.separator) )//dirName不以分隔符结尾则自动添加分隔符
dirName = dirName + File.separator;
File file = new File(dirName);//根据指定的文件名创建File对象
if ( !file.exists() || ( !file.isDirectory() ) ){ //目录不存在或者
log.error("目录删除失败"+dirName+"目录不存在!" );
return false;
}
File[] fileArrays = file.listFiles();//列出源文件下所有文件,包括子目录
for ( int i = 0 ; i < fileArrays.length ; i++ ){//将源文件下的所有文件逐个删除
this.deleteAnyone(fileArrays[i].getAbsolutePath());
}
if ( file.delete() )//删除当前目录
log.error("目录"+dirName+"删除成功!" );
return true;
}
(3)service删除文件的方法
//删除文件,分块,ts以及m3u8文件
@Transactional
public ResponseResult deleteUploadFileChunks(String mediaId) {
//查询mongodb中是否包含这调数据
Optional<MediaFile> optionalById = this.mediaFileRepository.findById(mediaId);
if (!optionalById.isPresent()){
//为空抛出异常
log.error("删除文件失败,数据库不包含词条记录;mediaId:"+mediaId);
ExceptionCast.cast(MediaCode.MERGE_FILE_DELETE_FAIL);
return new ResponseResult(CommonCode.FAIL);
}
//获取上传文件路径(路径格式E:\xcEdu\xcVideo\0\1\013b627312c228c7d1a068b58844cdb4)删除以文件ID命名的文件夹及其所有的子文件
String deleteFilePath=this.upload_location+mediaId.substring(0,1)+"/"+mediaId.substring(1,2)+"/"+mediaId;
//调用私用方法进行删除操作
boolean result =this.deleteAnyone(deleteFilePath);
if (!result){
//删除出错
log.error("删除文件失败目录不存在;deleteFilePath:"+deleteFilePath);
ExceptionCast.cast(MediaCode.MERGE_FILE_DELETE_FAIL);
return new ResponseResult(CommonCode.FAIL);
}
//删除数据库记录
this.mediaFileRepository.deleteById(mediaId);
return new ResponseResult(CommonCode.SUCCESS);
}
测试
我们删除一个已经存在的文件,然后重新上传再次删除不会抛出异常并成功删除
本人技术有限如有任何问题,或者更好的解决方法直接评论私聊我即可