2020-04-11 16:57:01 +08:00

193 lines
6.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.codesdream.ase.component.activity;
import com.codesdream.ase.exception.conflict.FileNameConflict;
import com.codesdream.ase.exception.notfound.AppendixFileNotFoundException;
import com.codesdream.ase.model.activity.Activity;
import com.codesdream.ase.model.activity.AppendixFile;
import com.codesdream.ase.repository.activity.ActivityRepository;
import com.codesdream.ase.service.AppendixFileService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.*;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Optional;
@Component
public class FileSystem {
@Resource
private AppendixFileService appendixFileService;
public static final int FAILED = -1;
//默认文件系统根路径
private static final String rootDir = "d:/temp";
/**
* 用于创建文件条目的辅助函数
* @param fileName 文件名
* @return 文件在数据库中的条目
*/
private AppendixFile createFileTable(String fileName)
{
AppendixFile appendixFile = new AppendixFile();
appendixFile.setFileName(fileName);
appendixFile.setLastEditTime(LocalDateTime.now());
String[] temp = fileName.split("\\.",2);
for(String s : temp)
System.out.println(s);
if(temp.length == 1)
appendixFile.setType("");
else
appendixFile.setType(temp[temp.length-1]);
return appendixFile;
}
/**
* 向磁盘中添加一个文件,并在数据库建立条目
* @param data 文件的数据
* @param fileName 文件名,包括拓展名
* @return 成功时返回文件id失败时返回FileSystem.FAILED
*/
public int addFile(byte data[], String fileName) throws Exception
{
AppendixFile appendixFile = createFileTable(fileName);
appendixFile = appendixFileService.save(appendixFile);
File file = new File(rootDir,""+appendixFile.getId());
FileOutputStream outputStream;
if(file.exists())
throw new FileNameConflict(
"file name conflict,there is a file in the directory, and is not created by this program",
file.getName());
File parent = file.getParentFile();
if(!parent.exists())
parent.mkdirs();
try{
file.createNewFile();
outputStream = new FileOutputStream(file);
outputStream.write(data);
outputStream.close();
return appendixFile.getId();
}
catch (Exception e){
appendixFileService.delete(appendixFile);
e.printStackTrace();
throw new Exception(e);
}
}
/**
* 根据id获取一个磁盘中的文件
* @param id 文件的id
* @return 成功返回文件的InputStream失败返回null
*/
public InputStream getFile(int id)throws AppendixFileNotFoundException
{
Optional<AppendixFile> optionalAppendixFile = appendixFileService.findById(id);
if(!optionalAppendixFile.isPresent())
throw new AppendixFileNotFoundException(
"the required id does not exist in the database",id,
AppendixFileNotFoundException.ID_NOT_FOUND);
AppendixFile appendixFile = appendixFileService.findById(id).get();
File file = new File(rootDir,""+appendixFile.getId());
if(file.exists())
{
try {
InputStream inputStream = new FileInputStream(file);
return inputStream;
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new AppendixFileNotFoundException(
"the required id exists in the database, but the stream can not be opened",id,
AppendixFileNotFoundException.STREAM_FAILURE);
}
}
else
throw new AppendixFileNotFoundException(
"the required id exists in the database, but the file is missing",id,
AppendixFileNotFoundException.FILE_NOT_fOUND);
}
/**
* 删除一个文件,如果该文件不存在,则不会发生操作
* @param id 要删除文件的id
*/
public void deleteFile(int id)
{
Optional<AppendixFile> optionalAppendixFile = appendixFileService.findById(id);
if(!optionalAppendixFile.isPresent())
return;
AppendixFile appendixFile = appendixFileService.findById(id).get();
File file = new File(rootDir,""+appendixFile.getId());
if(file.exists()) {
file.delete();
appendixFileService.delete(appendixFile);
}
}
/**
* 根据id获取一个文件的条目其中包含文件信息
* @param id 要寻找条目的id
*/
public AppendixFile getFileData(int id)
{
Optional<AppendixFile> optionalAppendixFile = appendixFileService.findById(id);
if(!optionalAppendixFile.isPresent())
throw new AppendixFileNotFoundException(
"the required id does not exist in the database",id,
AppendixFileNotFoundException.ID_NOT_FOUND);
AppendixFile appendixFile = appendixFileService.findById(id).get();
return appendixFile;
}
/**
* 维护数据库,删去所有文件已经缺失的条目(仅用于在文件系统出现故障时的维护)
*/
public void databaseRefresh()
{
for (AppendixFile appendixFile:
appendixFileService.findAll()) {
File file = new File(rootDir,""+appendixFile.getId());
if(!file.exists())
appendixFileService.delete(appendixFile);
}
}
/**
* 维护磁盘,删除指定根目录下所有不在数据库中的文件(仅用于文件系统出现故障时的维护)
*/
public void diskRefresh()
{
File dir = new File(rootDir);
if (dir.exists()) {
if (null == dir.listFiles()) {
return;
}
for(File file : dir.listFiles())
{
int id;
try{
id = Integer.parseInt(file.getName());
if(!appendixFileService.findById(id).isPresent())
file.delete();
}
catch (Exception ex){
file.delete();
}
}
}
}
}