檔案重新命名小程式(適用於unix系c )

2021-07-04 22:30:52 字數 3354 閱讀 6266

注:此**還是有問題,如果只重編號而字首字尾都不變的話,仍然會出現重名覆蓋的情況,例a0.b a1.b a2.b,想重新命名為a1.b a2.b a3.b,此**會將a0命名為a1,於是原來的a1就被覆蓋了。現在想到的辦法是先迴圈一邊源檔名重新命名為新名字+temp字尾,然後再迴圈一次將新名字+temp來rename為新名字,這樣就能解決問題,但消耗比較大效率不夠,期待有更好解決方法。修改**就不貼了。

需求邏輯很簡單,就是不改字尾只重新命名字首(後來增加為全可修改),可以遞迴子目錄。

單個檔案下的命名解決,遞迴子目錄的也不難,加個while迴圈提供選擇就行。

完成後的程式還算好用,可以只命名字首、只命名字尾、全部重新命名、保留原序號重新命名什麼的,例如把蒼老師的作品批量命名為《明治維新之藝妓篇1-10》

**如下:

/*

* 如果直接修改檔名,就算先將檔名入棧留做比較用,

* 也會由於readdir按首字元排序讀檔案再修改,出現10命名為2後,

* 覆蓋原2檔案

*/#include #include #include #include #include #include #define string_size 1024

using namespace std;

typedef vectorfilename_vector;

typedef vector::iterator fnv_iter;

#pragma mark - 個人用debug相關

#define abyndebug

#ifdef abyndebug

// 除錯用列印函式

void debugfunction(struct dirent const *dp)

#else

void debugfunction(struct dirent const *dp){};

#endif

void displayvector(filename_vector &fnv)

cout << "-----------------------------" << endl;

}// 判斷讀入檔案字尾是否為"ini" "db" "thumb"

string suffixfromoldname(string source);

bool issystemobjs(struct dirent *dp)

string result = suffixfromoldname(dp->d_name);

if (strcmp(result.c_str(), "ini") == 0 || strcmp(result.c_str(), "db") == 0 || strcmp(result.c_str(), "thumb") == 0 )

return false;

}#pragma mark - 使用者輸入名字編號等操作相關函式

// 從使用者輸入獲取newname_number

int gainnewname_number()

}return source;

}// 從使用者輸入獲取newname_prefix

void gainnewname_prefix(string *newname_prefix)

// 獲取old_name的字尾,從後往前找

string suffixfromoldname(string source)

return "";

}#pragma mark - 以filenamevector的形式來處理重新命名

// 遍歷資料夾將所有檔案入棧並公升序排序

// 獲取old_name中的數字用於新編號

int numbersfromoldname(string source)}}

}return atoi( (source.substr(up, (down - up))).c_str() );

}bool asendvector(const string s1, const string s2)

// 以filename向量組的形式重新命名

void renamefilenameinvector(filename_vector &fnv, string const *pathname, string const *newname_input, int index, string *name_suffix)

else

*name_prefix = *newname_input + *newname_index;

if (*name_suffix == "")

else

new_suffix = *name_suffix;

*newname = *pathname + *name_prefix + "." + new_suffix;

string::size_type point = string::npos;

if ( (point = iter->rfind('.')) == string::npos)

else

else

perror("rename");}}

delete oldname;

delete newname;

delete newname_index;

delete name_prefix;

}// 遞迴子目錄

void recursiondirectory(const string ¤t_pathname, const string &abslutepath)

string *newname_suffix = new string;

string *newname_input = new string;

int index = 0;

filename_vector fnv;

/if ( (dp = readdir(dirp))->d_type == dt_dir )

break;

case '2':

break;

case '3':

break;

case '4':

return; //直接跳出本次遞迴}}

/while ( (dp = readdir(dirp)) != null)

else if (dp->d_type == dt_reg)

else if (dp->d_type == dt_dir)

}//拿到所有名字後進行重新命名

if (fnv.size())

delete newname_input;

delete newname_suffix;

closedir(dirp);

free(dp);

}#pragma mark - main

int main(void)

適用於python的 vimrc檔案

根據我的需求做了一些小的改動。file vimrc date 2009 09 22 author gashero note 配置乙份簡單的vim配置檔案 set nocompatible 非相容模式 syntax on 開啟語法高亮 set background dark 背景色 color des...

適用於各種列表操作的Python程式

here,we are implementing apython program for various list operations,following operations are being performed in the list,在這裡,我們正在為各種列表操作實現python程式,正在...

Lazarus開啟URL及檔案 適用於WinCE

uses lclintf procedure tform1.button1click sender tobject begin 開啟網頁 lclintf.openurl www.hao123.com 必須至少加上www不然它會認為是乙個檔案,開啟檔案 同樣可以使用openurl,看原始碼其實他呼叫的...