表结构:
(parentId为父文件的ID)
设计思想:
从前台获取的参数:ids(所选中的文件或文件夹的id数组),dst(目的地文件的id)。
步骤:1.把ids的文件在HDFS中移动到dst 2.将复制文件添加到file与user_file表中。
难点解析 :复制的难点在于需要将文件信息添加入file表,并且需要将父子文件的关系传到user_file表中。我是这样实现的,递归执行复制文件的函数,但是在递归过程中要先将这一级的文件复制,然后在复制文件夹,具体的实现将在下面的代码中体现,注释写的也很详细。
public List<FileBean> getByParentId(UserBean userBean,
@RequestParam(value = "parentId", required = true, defaultValue = "0") long parentId) {
List<FileBean> list = new ArrayList<FileBean>();
try {
Table table = HBaseDB.getConn().getTable(TableName.valueOf(Constants.HBASE_TABLE_USER_FILE));
//前缀过滤器:筛选出具有特定前缀的行键的行
Scan scan = new Scan();
Filter filter = new PrefixFilter(Bytes.toBytes(userBean.getId()+"_"+parentId+"_"));
scan.setFilter(filter);
ResultScanner resultScanner = table.getScanner(scan);
for(Result result : resultScanner){
if(!result.isEmpty()){
long id = Bytes.toLong(result.getValue(Bytes.toBytes(Constants.HBASE_FAMILY_USER_FILE_FILE), Bytes.toBytes(Constants.HBASE_COLUMN_USER_FILE_FILE_ID)));
if(id > 0){
//file表中获取文件的详细信息
list.add(getById(id));
}
}
}
resultScanner.close();
table.close();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
private void copyDir(UserBean userBean,FileBean srcBean,FileBean dstBean,String parentPath,long parentId){
//获取父文件下一级的所有文件
List<FileBean> fileBeans = getByParentId(userBean, srcBean.getId());
for(FileBean fileBean : fileBeans){
FileBean fileBean2 = new FileBean();
fileBean2.setDate(fileBean.getDate());
fileBean2.setLength(fileBean.getLength());
fileBean2.setName(fileBean.getName());
fileBean2.setOrginalName(fileBean.getOrginalName());
fileBean2.setPath(fileBean.getPath());
fileBean2.setDir(fileBean.isDir());
fileBean2.setFile(fileBean.isFile());
fileBean2.setType();
fileBean2.setViewflag();
System.out.println("副本:"+fileBean2);
addFile(fileBean2);
}
//优先让该层的文件执行完
//对文件的操作:添加进user_file表
// 更改路径
for(FileBean fileBean : fileBeans){
if(fileBean.isFile()){
try {
Table table = HBaseDB.getConn().getTable(TableName.valueOf(Constants.HBASE_TABLE_FILE));
Scan scan = new Scan();
Filter filter = new SingleColumnValueFilter(Bytes.toBytes(Constants.HBASE_FAMILY_FILE_FILE), Bytes.toBytes(Constants.HBASE_COLUMN_FILE_PATH), CompareOp.EQUAL, Bytes.toBytes(fileBean.getPath()));
((SingleColumnValueFilter) filter).setFilterIfMissing(true);
scan.setFilter(filter);
ResultScanner resultScanner = table