只是一支兩百行左右的小程式,沒什麼技術含量。主要用於漫畫圖檔,因為有時候檔名若沒做好格式化,看圖軟體便會判斷失誤,像是4.jpg會排列在39.jpg和40.jpg之間。有點麻煩,之前我的辦法是用批次檔,不過每次都要稍作修改,所以乾脆寫個萬用型。雖然還沒研究怎麼操作unicode檔名,但處理起一般的檔名應該都沒問題。
程式以純C撰寫,主要是因為考量到編譯後的實品大小。以C-free編譯後只占5Kb(核心也是gcc,但不曉得是使用哪些參數,總是能編譯出最迷你的程式檔),而以正規gcc編譯加上icon圖示資源檔也只占18Kb,比之隨便include個C++頭文件便一兩百kb,要精簡多了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
/* 圖片更名小程式 編譯環境:Dev C++ 4.9 (C-free無法編譯) 功能:將圖片流水編號名稱格式化 例如:adf4.jpg -> adf004.jpg dd05.jpg -> dd005.jpg ck(11).jpg -> ck(011).jpg 侷限:對非BIG5編碼的檔案名稱無效,如日文或簡體字 update: 2010.12.29 */ #include <windows.h> #include <shlobj.h> #include <stdio.h> //#define DEBUG // 印出處理過程 #define EQU == #define TRUE 1 #define FALSE 0 #define STR_LEN 100 #define STR_LEN_S 30 #ifdef DEBUG #define PRINT(str1, str2) printf(str1); printf("[%s]", (str2)) #endif int getDotPos ( char *name ) // 取得逗點位置 { int dotPos = -1 ; int i ; for ( i = 0 ; name[i] ; i ++ ) if ( name[i] EQU '.' ) dotPos = i ; return dotPos ; } int getLastNumPos ( char *name ) // 取得後面數來第一個數字的位置 { int dotPos = -1 ; int i ; for ( i = 0 ; name[i] ; i ++ ) if ( name[i] <= '9' && name[i] >= '0' ) dotPos = i ; return dotPos ; } int isPicExtName ( char *extName ) // 是否為圖片的副檔名,是傳回1, 否傳回0 { char *picExtName[20] = { "jpg", "JPG", "bmp", "BMP", "gif", "GIF", "png", "PNG", "jpeg", "JPEG", "psd", "PSD", "pix", "PIX", "tif", "TIF", "pcx", "PCX", "pcd", "PCD" } ; int isPic = FALSE ; int i ; for ( i = 0 ; i < 20 ; i ++ ) { if ( strcmp ( extName, picExtName[i] ) EQU 0 ){ isPic = TRUE ; #ifdef DEBUG printf ( " [ 副檔名: %s ] ", picExtName[i] ) ; #endif } } return isPic ; } char* getExtName ( char *name ) // 取得副檔名 { char *extName = ( char* ) malloc ( STR_LEN_S*sizeof ( char ) ) ; int dotPos = getDotPos ( name ) ; int count = 0 ; int i = dotPos+1 ; for ( ; name[i] ; i ++ ) extName[count++] = name[i] ; return extName ; } char* getLastNStr ( char *str, int n ) // 取得str中從n開始數的字串 { char *newStr = ( char* ) malloc ( STR_LEN_S*sizeof ( char ) ) ; int count = 0 ; int length = strlen( str ); for ( ; n <= length ; n ++ ) newStr[count++] = str[n] ; return newStr ; } int isNum ( char c ) // 是否為數字 { if ( c >= '0' && c <= '9' ) return TRUE ; else return FALSE ; } int isPic ( char *name ) // 檢查此檔案是否為圖片 { int i, j = 0 ; int dotPos = getDotPos ( name ) ; char extName[STR_LEN] = {0} ; for ( i = dotPos+1 ; i && name[i] ; i ++ ) { extName[j++] = name[i] ; } if ( isPicExtName ( extName ) ) return TRUE ; else return FALSE ; } void handlePicName ( char *oldName, char *newName ) // 處理圖片檔案名稱 // ex: gh1.jpg -> gh001.jpg // ex: cd59.jpg -> cd059.jpg { int dotPos = getDotPos ( oldName ) ; char numStr[6] = {0} ; int lastNumPos = getLastNumPos ( oldName ) ; char *lastNstr = getLastNStr( oldName, lastNumPos+1 ); if ( !isNum ( oldName[lastNumPos-1] ) ) { // ex. abc7.jpg numStr[0] = oldName[lastNumPos] ; strncpy ( newName, oldName, lastNumPos ) ; strcat ( newName, "00" ) ; strcat ( newName, numStr) ; strcat ( newName, lastNstr ) ; } else if ( !isNum ( oldName[lastNumPos-2] ) ) { // ex. def33.jpg numStr[0] = oldName[lastNumPos-1] ; numStr[1] = oldName[lastNumPos] ; strncpy ( newName, oldName, lastNumPos-1 ) ; strcat ( newName, "0" ) ; strcat ( newName, numStr ) ; strcat ( newName, lastNstr ) ; } free ( lastNstr ); } int main (){ char path[MAX_PATH+1]; WIN32_FIND_DATA fd; HANDLE hFind; char *newName = ( char* ) malloc ( STR_LEN*sizeof ( char ) ) ; strcpy ( path, "" ) ; // 執行檔現在的目錄 if (1){ lstrcat ( path, "*.*" ) ; hFind = FindFirstFile ( path, &fd ); path[lstrlen(path)-3]=0; do { #ifdef DEBUG printf ( "\n%s%s", path,fd.cFileName ) ; #endif if ( isPic ( fd.cFileName ) ) { memset ( newName, '\0', STR_LEN*sizeof ( char ) ) ; #ifdef DEBUG printf ( " 這是圖片! " ) ; #endif handlePicName ( fd.cFileName, newName ) ; #ifdef DEBUG if ( newName[0] ) printf ( " [ 新檔名: %s ]", newName ) ; else printf ( " [ 檔名不變 ]" ) ; #endif #ifndef DEBUG rename ( fd.cFileName, newName ) ; #endif } } while ( FindNextFile(hFind,&fd ) ); if ( hFind != INVALID_HANDLE_VALUE ) FindClose ( hFind ) ; } free ( newName ) ; #ifdef DEBUG printf ( "\n" ) ; system ( "PAUSE" ) ; #endif return 0; }
No response to “圖片檔名流水號格式化小程式” ;
張貼留言