需求:一个文件夹被复制,要求新文件夹的名字合适且不重复。
在 nodejs后端,我在实现文件夹复制的功能时,发现简单的给原名子添加 “的副本” 作为新名字,复制多次的话得到的“...的副本的副本...”特别长,且没有什么意义,于是决定模仿 mac 的文件复制的命名的表现,写了个命名算法。 这个算法的代码实现很简单,难的是理解需求和详细规则(即为什么要这么做)。
关于mac文件重命名的规则
每次复制文件,如果不是“的副本”结尾的文件,复制的新文件会加上“的副本( n)”,这里的n是自然数字,不含前导零。括号是指可能有,也可能没有空格和数字
如果原文件名是“的副本”结尾,复制出的新文件的名字会加上“ n”。
如果原文件名是“的副本 n”,复制出的新文件名结尾的数字会比原名的索引大且向上最接近原名且不和其他文件重名。
复制时,如果原文件夹是“的副本”加上有前导0时,会去掉前导0,并应用上一条规则。
文件夹视为文件,即创建的新文件名不能和当前文件夹下的文件重名
只要明确了重命名的详细规则,我们就很容易明确如何算法的实现细节。
2019.3.25更新
优化 重写了代码,包装成一个方法,可以自定义后缀名。
/**
* 文件复制的命名算法
* @param {string} oName 被复制的文件的名称
* @param {Array} filenames 目录下的所有文件名数组
* @param {string} suffix 后缀(默认为'的副本')
*/