类似百度网盘、window文件重命名规则 代码实现
最近我们公司在做一个类似百度网盘的一个公司内部网盘的项目,功能也比较简单,文件上传、解压、查看、下载等。我这边主要负责网盘服务后台接口的开发,有个业务场景就是,同一用户在同一文件夹相同格式下的不能有相同的名称,如果有,当需要在保存是,添加个(1)等,例如当前目录里 “我的文档.txt”,则再上传“我的文档.txt”需要修改为"我的文档(1).txt",如果当前目录里同时有"我的文档.txt,我的文档(1).txt",则再上传“我的文档.txt”需要修改为“我的文档(2).txt”,具体的需求可以参考百度网盘及window上的命名方式。
因为技术水平的限制,之前想的用正则表达式去做匹配来实现这个功能,但是想了一段时间,还是没想出来,为了尽快完成项目,所以先用笨办法先实现,后面有时间了再用正则的方式做一下。下面是代码的实现。
/**
* 根据新增的文件名称 检查是否与已有的文件冲突 有冲突则重命名
*
* @param nameList
* @param name
* @return
*/
private static String getNotExistName(List<String> nameList, String name) {
while (true) {
if (!nameList.contains(name)) return name;
Integer left = name.lastIndexOf("(");
if (left == -1) {
return getNotExistName(nameList, name + "(1)");
}
Integer right = name.indexOf(")", left);
if (right == -1) {
return getNotExistName(nameList, name + "(1)");
}
if (right < name.length() - 1) return getNotExistName(nameList, name + "(1)");
String substring = name.substring(left + 1, right);
try {
Integer i = Integer.parseInt(substring) + 1;
return getNotExistName(nameList, name.substring(0, left) + "(" + i + ")");
} catch (ClassCastException e) {
return getNotExistName(nameList, name + "(1)");
}
}
}
这个方法有俩个参数,第一个是参数是当前用户在当前文件夹当前后缀的所有文件名称的列表,第二个参数是要修改的名称,实现方式就是通过递归的方式来实现了,代码逻辑很简单。