'일련번호'에 해당되는 글 1건

  1. 2006.10.03 리네이머 일련번호...

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

여기서 일련번호란 사용자가 변경할 파일명을 "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
,