Last Update: Nov.5,2003

C Source Library

「Borland C++ 5.5」、「Microsoft Visual C++ 6.0」でコンパイル出来ます。

■ 大文字のファイル名を小文字に変換

/*
 *  rename.c : 大文字のファイル名を小文字に変換
 *
 *      Copyright (c) 2003 AOK. 
 *  
 *      2003.10.27 - 初版
 *      2003.10.28 - 2版
 *
 *      使い方: RENAME ファイル [ファイル ...]
 *  
 */

#include <windows.h>
#include <shlwapi.h>
#include <stdio.h>
#include <mbctype.h>

#pragma comment(lib, "shlwapi.lib")

/* [A-Z] は小文字に変換する */
int MakeLower(char *filename)
{
    unsigned char *s = (unsigned char *)filename;
    int n = 0;
    while (*s != '\0') {
        if (*s >= 'A' && *s <= 'Z') {
            ++n; *s += 0x20;
        } else if (_ismbblead(*s)) {
            if (*++s == '\0') break;
        }
        ++s;
    }
    return n;
}

/* 拡張子がすべて大文字かどうか */
BOOL IsUpperExtension(const char *filename)
{
    unsigned char *ext;
    ext = (unsigned char *)PathFindExtension(filename);
    while (*ext != '\0') {
        if (*ext >= 'a' && *ext <= 'z') {
            return FALSE;
        } else if (_ismbblead(*ext)) {
            if (*++ext == '\0') break;
        }
        ++ext;
    }
    return TRUE;
}

/* ファイル名がすべて大文字かどうか */
BOOL IsUpperAll(const char *filename)
{
    unsigned char *s = (unsigned char *)filename;
    while (*s != '\0') {
        if (*s >= 'a' && *s <= 'z') {
            return FALSE;
        } else if (_ismbblead(*s)) {
            if (*++s == '\0') break;
        }
        ++s;
    }
    return TRUE;
}

/* メイン */
int main(int argc, char *argv[])
{
    int i;
    char path[MAX_PATH];
    char old_name[MAX_PATH];
    char new_name[MAX_PATH];

    for (i = 1; i < argc; i++) {
        lstrcpy(path, argv[i]);
        lstrcpy(old_name, argv[i]);
        lstrcpy(new_name, argv[i]);

        /* カレントディレクトリを変更 */
        PathRemoveFileSpec(path);
        SetCurrentDirectory(path);

        /* ファイル名を取り出す */
        PathStripPath(old_name);
        PathStripPath(new_name);

        /* すべて大文字のものだけ変換 */
        if (IsUpperAll(old_name) && MakeLower(new_name) > 0)
        {
            if (MoveFile(old_name, new_name))
                printf("%s -> %s\n", old_name, new_name);
        }
    }
    
    printf("何かキーを押すと終了します。");
    getchar();
    
    return 0;
}