let 連續複製 資料夾複製的命名演算法(仿mac)

2021-10-13 11:56:48 字數 1331 閱讀 8954

需求:乙個資料夾被複製,要求新資料夾的名字合適且不重複。

在 nodejs後端,我在實現資料夾複製的功能時,發現簡單的給原名子新增 「的副本」 作為新名字,複製多次的話得到的「...的副本的副本...」特別長,且沒有什麼意義,於是決定模仿 mac 的檔案複製的命名的表現,寫了個命名演算法。 這個演算法的**實現很簡單,難的是理解需求和詳細規則(即為什麼要這麼做)。

關於mac檔案重新命名的規則

每次複製檔案,如果不是「的副本」結尾的檔案,複製的新檔案會加上「的副本( n)」,這裡的n是自然數字,不含前導零。括號是指可能有,也可能沒有空格和數字

如果原檔名是「的副本」結尾,複製出的新檔案的名字會加上「 n」。

如果原檔名是「的副本 n」,複製出的新檔名結尾的數字會比原名的索引大且向上最接近原名且不和其他檔案重名。

複製時,如果原資料夾是「的副本」加上有前導0時,會去掉前導0,並應用上一條規則。

資料夾視為檔案,即建立的新檔名不能和當前資料夾下的檔案重名

只要明確了重新命名的詳細規則,我們就很容易明確如何演算法的實現細節。

2019.3.25更新

優化 重寫了**,包裝成乙個方法,可以自定義字尾名。

* 檔案複製的命名演算法

* @param oname 被複製的檔案的名稱

* @param filenames 目錄下的所有檔名陣列

* @param suffix 字尾(預設為'的副本')

const getcopyedname = (oname, filenames, suffix = '的副本') => ( \\d+)?$`).exec(oname);

console.log(match);

// 1. 求出 oname 的 索引值 和 詞根(不含字尾和索引的源檔名 )

if (match) else $( [1-9][0-9]*)?$`); // 注意這裡要求為非0開始的數字

let indexs = ;

filenames.foreach((item) => else else 的副本( [1-9][0-9]*)?$/ 的所有名字,正規表示式的意思是要求符合「xx的副本」或者「xx的副本 n」(注意這個 n 是不含前導0的數字)。

let checkednamefolders = await models.folder.findall(的副本( [1-9][0-9]*)?$`

let checkedname = checkednamefolders.map(item => 的副本`;

break;

default:

newname = `$的副本 $`;

break;

到了這裡,我們就獲得了想要的新資料夾的名字了。

linux複製資料夾 重新命名資料夾 刪除資料夾

linux中複製命令為cp 即copy縮寫 重新命名使用mv命令 即move縮寫 來實現,刪除命令為rm 即remove縮寫 如果操作物件是單個檔案,複製和刪除以及重新命名很簡單,如下 cp a.txt a.txt 將a.txt另存為a.txt mv a.txt a.txt 將a.txt重新命名為a...

檔案 資料夾複製

通道對通道複製效率高 param f1 原始檔 param f2 目的檔案 return throws exception public static long forchannel file f1,file f2 throws exception if inc.size inc.position ...

複製資料夾函式

函式名稱 copydir 函式功能 複製資料夾 函式返回 bool 如果是true,複製成功,否則失敗。引數說明 param cstring strsrcpath 源資料夾 param cstring strdstpath 目標資料夾 bool copydir cstring strsrcpath,...