Renamer4.exe

 파일명 일괄변경 프로그램 - 4


도깨비님의 요청에 의해 오랜만에 리네이머에 손을 봤다.


우선 기존에 일련번호 제작에 썼던 문자인 '#'을 '*'로 변경했다. 일련번호가 숫자라는 의미로 그냥 #으로 썼었는데 파일명에 #을 써야하는 경우 때문에 변경을 했다.

도깨비님은 escape sequence를 이용해서 파일명에 '#'을 입력할 수 있게 해달라고 요청을 하셨는데 코딩하다보니 어차피 '*'표는 파일명으로 사용을 못하기 때문에 일련번호에 쓰일 문자를 아예 변경하는 것이 더 편하다고 생각되서 현재처럼 변경했다.

그리고 문자 집합을 기존 '멀티바이트 문자 집합'에서 '유니코드 문자 집합'으로 변경함으로써 파일명 변경시 유니코드를 지원한다.

프로젝트 설정에서 문자 집합을 '유니코드 문자 집합'으로 변경하고 문자열 처리와 관련된 변수 선언과 함수 등을 유니코드와 관련된 것으로 바꾸긴 했는데, 여지까지 유니코드 프로그래밍을 안해봤고, 현재 한글OS만 사용중이라서 완벽한 테스트는 하지 못했다.

단순히 키보드입력기에 일본어를 추가하고 테스트해보니 기존 버전에서는 파일명을 바꾸지 못했는데, 이번 버전에서는 파일명을 문제없이 변경했다.

Source: https://github.com/gungume/Renamer/releases/tag/0.4

(사용언어 및 제작툴 : MFC / VS2008)

이전 버전 받기
2006/09/05 - [MFC/Application] - 파일명 일괄변경 프로그램
2007/05/31 - [MFC/Application] - 파일명 일괄변경 프로그램 - 2
2007/12/29 - [MFC/Application] - 파일명 일괄변경 프로그램 - 3

Posted by Gungume
,

Renamer3.exe

파일명 일괄변경 프로그램 - 3


오랜만에 업뎃한 리네이머...

기능상의 변화는 없고 성능을 조금 향상시켰다.

우선 왜 그랬는지 모르겠지만 기존 프로그램에서 진행률 출력부분에 Sleep() 함수가 쓰인거를 삭제했고, 많은 갯수의 파일을 다룰때 특히 파일을 드래그&드롭할 때 파일 갯수가 많으면 응답없음이 떴었는데 그 부분을 해결하기 위해서 단일 스레드를 사용했다.

드래그&드롭과, 파일명 변경하는 부분에 스레드를 사용했는데 그냥 단일스레드라 속도향상과는 별 상관없을듯;;;

또한 기존버전까지 있었던 이미지리스트를 제거했다. 있으면 모양은 괜찮아보이는데 드래그&드롭 부분을 스레드로 돌리고나니 뭐가 잘못됐는지 이미지리스트를 얻고 셋팅하는 부분에서 너무 많은 시간이 걸려서 걍 제거 ㅡㅡ

마지막으로 이미 목록에 추가된 파일을 다시 추가하는 것에 대한 중복처리를 반복문으로 처리했었는데 함수를 이용 검색하는 방법으로 중복처리를 함으로써 속도향상시킴...

Source: https://github.com/gungume/Renamer/releases/tag/0.3
(사용언어 및 제작툴 : MFC / VS2005)

이전 버전 받기
2006/09/05 - [프로그래밍.../Source] - 파일명 일괄변경 프로그램
2007/05/31 - [프로그래밍.../Source] - 파일명 일괄변경 프로그램 - 2


최신버전 받기

Posted by Gungume
,

Renamer2.exe

파일명 일괄변경 프로그램 - 2

기존에 만들었던 파일명 일괄변경 프로그램에 약간 손을 봤다...

우선 일련번호의 시작번호를 지정할 수 있는 기능을 넣었다.

기존 버전에서는 시작번호가 항상 1부터 시작되서 같은 분류에서 사진이 추가되는 경우 처음부터 파일명을 다시 지정해야되는 불편함이 있어서 입력한 숫자를 일련번호의 시작번호로 할수 있도록 기능을 넣었다...


그리고 리스트컨트롤의 컬럼을 클릭시 정렬하는 기능을 추가했다.

드래그&드롭시 선택된 파일의 중간지점을 잡고 끌어오면 그 파일을 기준으로 목록에 추가된다.

예를 들어 파일명이 FileName1~FileName10까지 있다면 전체 선택후 FileName5를 잡고 드래그를 하면 리스트컨트롤에 5~10, 1~4 이순서데로 들어가므로 파일명 변경시 원래 순서가 중요하다면 컬럼을 클릭함으로써 정렬을 하고 파일명 변경이 가능하다.

대충 만들어서 모든 컬럼에 대해 각각 정렬이 되니 사용시에는 '원본 파일명' 칼럼에 대해서만 정렬기능을 사용하면 될듯함...

Source: https://github.com/gungume/Renamer/releases/tag/0.2
(사용언어 및 제작툴 : MFC / VS2005)

이전 버전 받기
2006/09/05 - [프로그래밍.../Source] - 파일명 일괄변경 프로그램

최신버전 받기
2008/07/09 - [MFC/Application] - 파일명 일괄변경 프로그램 - 4

Posted by Gungume
,

예전에 급조해서 만든 리네이머에서 일련번호 관련 소스이다...

여기서 일련번호란 사용자가 변경할 파일명을 "File ## Name ###" 이라고 입력한다면..."File 01 Name 001", "File 02 Name 002", "File 03 Name 003" 형식으로 번호가 증가되는 것을 의미한다...

파일명 중간에 임의의 일련번호 기호인 '#'을 넣어도 위와 같이 일련번호가 생성되는 방법으로 구현하느라 머리 좀 썼다...머 일련번호가 보통 파일명 끝에만 붙지만 중간에 넣어도 작동되게 한 이유는....알씨에서 파일명 일괄변경 할때 저런것도 되길래 나도 그냥 해봤다 ㅡㅡ;

알고리즘(?)의 기본 원리는 별거 없다...그냥 사용자가 일련번호 기호를 포함한 변경할 파일명을 전부 입력했다면 그냥 문자열 길이만큼 루프를 돌면서 문자 하나씩 비교를 한다..

일반 문자이면 결과변수에 값을 넣고 만약에 '#'이라면 연속되는 '#'의 갯수를 파악해서 CString클래스의 Format() 함수를 이용해서 일련번호를 만든후 이 값을 결과변수에 넣었다...

이 간단한거를....하루죙일 생각해서야 만들었다...

더 큰 문제(?)는 루프를 너무 많이 돈다...초기에 한번만 반복하고 이후에는 숫자만 바꿔주면 될듯한데 도저히 방법이 안 떠오른당 ㅡㅡ;

아래는 리네이머에 있는 일련번호 관련 풀소스이다...

리스트컨트롤에 있는 데이터 갯수만큼 반복문을 돌면서 하나씩 이름을 바꾸는거다...

파일명 변경후에는 원본 파일의 확장자를 따로 파싱해서 붙여버리는 형식이다...

막코딩하다가 만들어진 알고리즘이라 주석을 심하게 달아놓음 ㅡㅡ;

void CRenamerDlg::OnEnChangeEditRename()
{
	// 입력한 형식데로 파일명 변경...일련번호 포함
	UpdateData(TRUE);
	CString strData = m_strRename; // 사용자가 입력한 변경할 파일명
	CString strTmp = _T("");  // 파일명 변경에 필요한 임시 변수
	CString strResult = _T("");  // 최종적으로 변경할 파일명
	
	int nTotalCnt = 1;  // 일련번호 카운터
	int nLength = 0;  // 각각의 일련번호 자릿수
	char ext[32];   // 파일경로에서 확장자만 따로 저장
	
	// 리스트컨트롤에 있는 모든 데이터에 대해 반복...
	for(int i=0; i<m_listCtrl.GetItemCount(); i++)
	{
		// 변경할 파일명의 길이만큼 반복...
		// 기본 로직은 일반 문자열과 일련번호인 #을 구분해서 
		// strResult에 계속 저장...
		for(int j=0; j<strData.GetLength(); j++)
		{
			// 한 문자씩 불러와서 # 문자인지 여부 판단
			// # 문자인경우 연속적으로 몇개 붙어있는지 판단
			// 연속적으로 붙어있는 갯수가 곧 일련번호의 자리수
			// 예 Test ### -> Test 001
			if(strData.GetAt(j) == '#')
			{
				while(strData.GetAt(j) == '#')
				{
					nLength++; // #문자 갯수 증가
					j++;  // 연속된 문자 판단위해 다음 문자로 이동
				}
				// while문 내에서 j값을 통해 다음 문자로 이동후에 비교를 하므로...
				// while문 탈출후 다시 위의 for문으로 돌아가면...
				// 다음, 다음 문자로 이동하므르로 문자 하나가 비교가 안되기에
				// j값 1 감소시킴
				j--;
				
				// 일련번호 완성
				strTmp.Format("%0*d", nLength, nTotalCnt);
				nLength=0;
				
				// strResult에 일련번호 데이터 추가
				strResult += strTmp;
			}
			else
			{
				// strResult에 단순 문자값 추가
				strResult += strData.GetAt(j);
			}
		}
		// 이곳까지오면 변경할 확장자가 없는 파일명 완성
		// 리스트컨트롤의 0번 칼럼은 Drag & Drop를 이용 데이터를 추가할때
		// 각 파일의 절대경로가 들어가 있음...
		// 이 정보 이용 각 파일의 확장자를 얻어올 수 있음...
		// 위에서 얻은 변경할 파일명과 원본 파일의 확장자를 합쳐서...
		// 변경할 파일명 최종 완성
		_splitpath(m_listCtrl.GetItemText(i, 0), NULL, NULL, NULL, ext);
		strResult+=ext;
		
		// 변경할 파일명을 3번 칼럼에 삽입
		m_listCtrl.SetItem(i, 3, LVIF_TEXT, strResult, NULL, NULL, NULL, NULL);
		
		strResult.Empty();
		nTotalCnt++;
	}
}

Posted by Gungume
,

Renamer.exe

파일명 일괄변경 프로그램



개인적으로 사진파일의 이름을 변경할때 쓰려고 급히 만든 파일명 일괄변경 프로그램...ㅡㅡ;

특별한 기능 없이 Drag & Drop를 이용 리스트컨트롤에 이름을 변경할 파일을 추가시키고 에디트박스에 일괄변경할 이름과 일련번호를 붙혀주면 파일명 부분만 변경하는 프로그램...

폴더는 목록에 추가되지 않고 파일의 확장자는 구분없이 목록에 추가되지만 특별한 기능 없이 파일명만 변경시키므로 목적에 따라 그림파일, 음악파일 등 나름데로 분류를 정해서 사용하는게 좋음...

개인사용 목적으로 만든거라서 딱히 rename() 함수에 대한 에러처리는 안함;;;


XP 스타일 버튼 클래스 출처 : http://www.softechsoftware.it/cxpstylebuttonst.html
Source: https://github.com/gungume/Renamer/releases/tag/0.1
(사용언어 및 제작툴 : MFC / VS2003)


최신버전 받기


Posted by Gungume
,