圖片檔名流水號格式化小程式

只是一支兩百行左右的小程式,沒什麼技術含量。主要用於漫畫圖檔,因為有時候檔名若沒做好格式化,看圖軟體便會判斷失誤,像是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 “圖片檔名流水號格式化小程式” ;

張貼留言