본 소스는 span style=font-weight: bold;임의 유포시에는 반드시 아래의 내용과 함께 배포할것/span을 유념해주세요. (span style=font-style: italic;잘못된 사용으로 사용자의 데이터가 유실되는것을 방지하기 위해서/span)br /br /br /본 프로그램의 최근 내용은 a target= class=postlink href=http://bbs.minzkn.com/viewtopic.php?f=2amp;t=849http://bbs.minzkn.com/viewtopic.php?f=2amp;t=849/a에서 확인하실수 있습니다.br /br /Copyright (저작권)br /~~~~~~~~~~~~~~~~~~br /br /Copyright (C) 2008 JaeHyuk Chobr /All rights reserved.br /br /!-- m --a target= class=postlink href=http://www.minzkn.com/http://www.minzkn.com//abr /br /br /특징br /~~~~br /br /이 프로그램은 span style=text-decoration: underline;파일명 또는 디렉토리명의 charset이 EUCKR인 경우 이것을 UTF-8로br /변경해주는 것/span입니다.br /br /br /주의br /~~~~br /br /이 프로그램으로 파일명을 변경하려고 한다면 span style=font-weight: bold;백업을 반드시 하시고서 실행/span하시기br /바랍니다.br /br /span style=font-weight: bold;본 프로그램의 제작자는 이 프로그램의 실행으로 발생하는 어떠한 문제도 책임을br /지지 않습니다./spanbr /br /br /br /사용법br /~~~~~~br /br / div class=quotetitlebQuote:/b/div div class=quotecontentexport nameconv=[yes | no]br /br /nameconv lt;pathgt;/divbr /br /br /환경변수 nameconv 를 yes로 export 하지 않는한 실제 이름 변경동작을 수행하지br /않습니다. 즉, 사전에 먼저 검사해보고 문제가 없을것이라고 판단되면 환경변수br /nameconv를 yes 로 export 하여 사용하도록 하여 혹시나 잘못된 변환에 대한br /문제점을 사전에 검사하도록 유도하는 방법으로 사용됩니다.br /br /nameconv 실행파일의 인자로 변경할 디렉토리 또는 파일명을 넘겨주면br /하위디렉토리까지 재귀적으로 모두 변경하게 됩니다.br /br /br /br /사용예br /~~~~~~br /br /만약 /mnt/my_data_disk 디렉토리의 하위 모든 파일을 EUCKR 에서 UTF-8 로br /변경하고자 한다면 다음과 같은 순서로 실행하면 됩니다.br /br /1. 제대로 변환되는지 검사만 수행br /br / div class=quotetitlebQuote:/b/div div class=quotecontentsh$ nameconv=no nameconv /mnt/my_data_disk/divbr /br /2. 출력되는 내용에서 문제없이 변경가능할것이라고 판단된다면 실제 변경 시작br /br / div class=quotetitlebQuote:/b/div div class=quotecontentsh$ nameconv=yes nameconv /mnt/my_data_disk/divbr /br /br / div class=codetitlebCode:/b/div div class=codecontent/*br /nbsp;Copyright (C) Information Equipment co.,LTD.br /nbsp;All rights reserved.br /nbsp;Code by JaeHyuk Cho lt;mailto:minzkn@infoeq.comgt;br /nbsp;CVSTAG=$Header: /cvsroot/inbt/mzapi/memo/nameconv/nameconv.c,v 1.1 2008/02/13 06:20:19 minzkn Exp $br /*/br /br /#include lt;sys/types.hgt;br /#include lt;sys/stat.hgt;br /#include lt;stdio.hgt;br /#include lt;stdlib.hgt;br /#include lt;string.hgt;br /#include lt;malloc.hgt;br /#include lt;dirent.hgt;br /br /#include lt;iconv.hgt;br /br /int g_nameconv_enable=0, g_nameconv_total = 0, g_nameconv_done = 0, g_nameconv_error = 0;br /br /static char * nameconv_iconv(const char *s_to_charset, const char *s_from_charset, char *s_name)br /{br /nbsp; nbsp; char *s_result = (char *)0;br /nbsp; nbsp; iconv_t s_iconv;br /nbsp; nbsp; unsigned char s_buffer[ 4 lt;lt; 10 ];br /nbsp; nbsp; char *s_in, *s_out;br /nbsp; nbsp; size_t s_in_size, s_out_size;br /br /nbsp; nbsp; s_iconv = iconv_open(s_to_charset, s_from_charset);br /nbsp; nbsp; if(s_iconv == ((iconv_t)(-1))) {br /nbsp; nbsp; nbsp; nbsp; perror(iconv_open);br /nbsp; nbsp; nbsp; nbsp; return((char *)0);br /nbsp; nbsp; }br /nbsp;nbsp; nbsp;br /nbsp; nbsp; s_in = s_name;br /nbsp; nbsp; s_in_size = strlen(s_name);br /nbsp; nbsp; s_out = (char *)(amp;s_buffer[0]);br /nbsp; nbsp; s_out_size = sizeof(s_buffer);br /br /nbsp; nbsp; if(iconv(s_iconv, (char **)(amp;s_in), (size_t *)(amp;s_in_size), (char **)(amp;s_out), (size_t *)(amp;s_out_size)) != ((size_t)(-1))) {br /nbsp;nbsp; nbsp;s_out_size = sizeof(s_buffer) - s_out_size;br /nbsp; nbsp; nbsp; nbsp; if((s_in_size == ((size_t)0)) amp;amp; (s_out_size gt; ((size_t)0))) {br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; s_result = (char *)malloc(s_out_size + ((size_t)2));br /nbsp;nbsp; nbsp; nbsp;nbsp; if(s_result != ((char *)0)) {br /nbsp;nbsp; nbsp; nbsp; nbsp; nbsp;nbsp; (void)memcpy(memset((void *)s_result, 0, s_out_size + ((size_t)2)), (char *)(amp;s_buffer[0]), s_out_size);br /nbsp;nbsp; nbsp; nbsp;nbsp; }br /nbsp;nbsp; nbsp;}br /nbsp; nbsp; }br /br /nbsp; nbsp; (void)iconv_close(s_iconv);br /nbsp; nbsp; return(s_result);br /}br /br /static void nameconv(const char *s_to_charset, const char *s_from_charset, const char *s_path)br /{br /nbsp; nbsp; DIR *s_dir;br /nbsp; nbsp; struct dirent *s_dirent;br /nbsp; nbsp; struct stat s_stat;br /nbsp; nbsp; size_t s_path_size;br /nbsp; nbsp; char *s_full_path;br /nbsp; nbsp; char *s_to_name;br /nbsp; nbsp; char *s_to_path;br /nbsp;nbsp; nbsp;br /nbsp; nbsp; s_dir = opendir(s_path);br /nbsp; nbsp; if(s_dir == ((DIR *)0))return;br /br /nbsp; nbsp; for(;;) {br /nbsp; nbsp; nbsp; nbsp; s_dirent = readdir(s_dir);br /nbsp; nbsp; nbsp; nbsp; if(s_dirent == ((struct dirent *)0))break;br /br /nbsp; nbsp; nbsp; nbsp; if((strcmp(s_dirent-gt;d_name, .) == 0) || (strcmp(s_dirent-gt;d_name, ..) == 0))continue;br /nbsp; br /nbsp; nbsp; nbsp; nbsp; s_path_size = strlen(s_path) + ((size_t)1) + strlen(s_dirent-gt;d_name);br /br /nbsp; nbsp; nbsp; nbsp; s_full_path = (char *)malloc(s_path_size + ((size_t)1));br /nbsp; nbsp; nbsp; nbsp; if(s_full_path == ((char *)0))continue;br /nbsp; nbsp; nbsp; nbsp; (void)sprintf(s_full_path, %s%s%s, s_path, /, s_dirent-gt;d_name);br /nbsp; br /nbsp; nbsp; nbsp; nbsp; if(lstat(s_full_path, (struct stat *)(amp;s_stat)) != 0) {br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; free((void *)s_full_path);br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; continue;br /nbsp; nbsp; nbsp; nbsp; }br /br /nbsp; nbsp; nbsp; nbsp; s_to_path = (char *)0;br /nbsp;nbsp; nbsp;s_to_name = nameconv_iconv(s_to_charset, s_from_charset, s_dirent-gt;d_name);br /nbsp;nbsp; nbsp;if(s_to_name != ((char *)0)) {br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; s_path_size = strlen(s_path) + ((size_t)1) + strlen(s_to_name);br /nbsp;nbsp; nbsp; nbsp;nbsp; s_to_path = (char *)malloc(s_path_size + ((size_t)1));br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; if(s_to_path != ((char *)0))(void)sprintf(s_to_path, %s%s%s, s_path, /, s_to_name);br /nbsp;nbsp; nbsp; nbsp;nbsp; free((void *)s_to_name);br /nbsp;nbsp; nbsp;}br /nbsp; br /nbsp; nbsp; nbsp; nbsp; if(S_ISDIR(s_stat.st_mode))nameconv(s_to_charset, s_from_charset, s_full_path);br /br /nbsp; nbsp; nbsp; nbsp; g_nameconv_total++;br /br /nbsp;nbsp; nbsp;if(s_to_path != ((char *)0)) {br /nbsp;nbsp; nbsp; nbsp;nbsp; int s_cmp;br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; s_cmp = strcmp(s_full_path, s_to_path);br /nbsp;nbsp; nbsp; nbsp;nbsp; br /nbsp;nbsp; nbsp; nbsp;nbsp; if(s_cmp == 0) {br /nbsp;nbsp; nbsp; nbsp; nbsp; nbsp;nbsp; (void)fprintf(stdout, \x1b[0m%s\x1b[0m =gt; \x1b[1;37m%s\x1b[0m\n, s_full_path, s_to_path);br /nbsp;nbsp; nbsp; nbsp;nbsp; }br /nbsp;nbsp; nbsp; nbsp;nbsp; else {br /nbsp;nbsp; nbsp; nbsp; nbsp; nbsp;nbsp; (void)fprintf(stdout, \x1b[1;33m%s\x1b[0m =gt; \x1b[1;37m%s\x1b[0m\n, s_full_path, s_to_path);br /nbsp;nbsp; nbsp; nbsp;nbsp; }br /nbsp; nbsp; nbsp; nbsp; nbsp;nbsp; nbsp;br /nbsp;nbsp; nbsp; nbsp;nbsp; if((g_nameconv_enable == 0) || (s_cmp == 0))g_nameconv_done++;br /nbsp;nbsp; nbsp; nbsp;nbsp; else if(rename(s_full_path, s_to_path) == 0)g_nameconv_done++;br /nbsp;nbsp; nbsp; nbsp;nbsp; else {br /nbsp;nbsp; nbsp; nbsp; nbsp; nbsp;nbsp; perror(rename);br /nbsp;nbsp; nbsp; nbsp; nbsp; nbsp;nbsp; g_nameconv_error++;br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; }br /nbsp;nbsp; nbsp; nbsp;nbsp; free((void *)s_to_path);br /nbsp;nbsp; nbsp;}br /nbsp;nbsp; nbsp;else {br /nbsp;nbsp; nbsp; nbsp;nbsp; (void)fprintf(stdout, \x1b[1;31m%s\x1b[0m\n, s_full_path);br /nbsp;nbsp; nbsp; nbsp;nbsp; g_nameconv_error++;br /nbsp;nbsp; nbsp;}br /nbsp; nbsp; }br /br /nbsp; nbsp; closedir(s_dir);br /}br /br /int main(int s_argc, char **s_argv)br /{br /nbsp; nbsp; const char *s_to_charset;br /nbsp; nbsp; const char *s_from_charset;br /nbsp; nbsp; const char *s_env;br /br /nbsp; nbsp; s_to_charset = UTF-8;br /nbsp; nbsp; s_from_charset = EUCKR;br /nbsp;nbsp; nbsp;br /nbsp; nbsp; s_env = getenv(nameconv);br /nbsp; nbsp; if(s_env != ((char *)0)) {br /nbsp; nbsp; nbsp; nbsp; if(strcmp(s_env, yes) == 0)g_nameconv_enable = 1;br /nbsp; nbsp; }br /br /nbsp; nbsp; nameconv(s_to_charset, s_from_charset, s_argc gt;= 2 ? s_argv[1] : .);br /br /nbsp; nbsp; (void)fprintf(stdout, nameconv result: total=%d, done=%d, error=%d\n, g_nameconv_total, g_nameconv_done, g_nameconv_error);br /br /nbsp; nbsp; return(EXIT_SUCCESS);br /}br /br //* End of source *//div
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/02/13 16:35 2008/02/13 16:35
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/233

댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/233

트랙백 주소 :: http://blog.minzkn.com/trackback/233

트랙백 RSS :: http://blog.minzkn.com/rss/trackback/233

트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/233

댓글을 달아 주세요

댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/233
댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/233