基于HBase的云盘项目复制功能总结

本文总结了基于HBase的云盘项目复制功能的设计与实现,包括表结构设计和具体步骤。难点在于处理文件及文件夹的父子关系,在HDFS中移动文件并在file与user_file表中更新信息。采用递归方法解决,详细实现见代码注释。
摘要由CSDN通过智能技术生成

表结构:

这里写图片描述
(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值