1. 학교 전산실과 교무실의 파일명 대혼란: "제각각 제출된 100개 과제물과 괄호 넘버링의 악몽"
공교육과 군부대 행정 실무에서 수십~수백 개의 파일을 체계적으로 관리하는 일은 업무 시간의 상당 부분을 소모하는 고된 작업입니다:
- 규격화되지 않은 학생 제출 파일명: 학생마다 파일명 형식이 달라 채점과 출결 확인 시 일일이 파일을 열어보아야 하는 병목이 발생합니다.
- 디지털 교안 및 이미지 리소스 정리: 교안 제작을 위해 캡처한 수십 장의 이미지 파일(`Screenshot_2026-09...png`)을 수업 순서(`Step_01.png`, `Step_02.png`)대로 정리하기 어렵습니다.
- 대소문자 및 확장자 불일치: 리눅스 서버나 웹 포털 업로드 시 `.PNG`와 `.png`, `.DOCX`와 `.docx`의 대소문자 차이로 인해 링크가 깨지는 사고가 빈번합니다.
2. 윈도우 파일 탐색기 및 단종된 레거시 리네이머의 한계: "규칙 부재와 되돌리기(Undo) 없는 영구 소실 공포"
Windows 파일 탐색기와 인터넷에서 다운로드받는 구형 유틸리티들은 안전성 면에서 치명적인 결함을 가지고 있습니다:
- 탐색기 다중 이름 바꾸기의 원본 파괴: 파일 여러 개를 선택하고 F2 키를 누르면 모든 파일의 고유 이름이 사라지고 오직 `지정한이름 (1).ext`, `지정한이름 (2).ext`로 덮어써집니다.
- 실시간 미리보기(Live Preview)의 부재: 버튼을 누르기 전까지 파일명이 어떻게 바뀔지 시각적으로 검증할 수 없어 오탈자나 정규식 실수 시 파일 시스템이 영구히 훼손됩니다.
- 되돌리기(Undo) 기능 미지원: 과거의 셰어웨어 프로그램들은 파일 이동/리네임 후 이전 파일명 히스토리를 메모리에 보관하지 않아, 실수를 인지했을 때 수백 개 파일의 원본을 영원히 찾을 수 없습니다.
3. 5대 리네이밍 규칙 엔진: 찾아바꾸기·접두접미·시퀀스(#)·대소문자·정규식(Regex)
ZeliRename은 교육 현장과 개발 환경에서 발생하는 모든 파일명 변경 요구를 단 5가지 모드로 완벽히 수용합니다:
- Mode 0: 찾아 바꾸기: 특정 단어나 연도를 일괄 치환 (예:
2025_➔2026_). - Mode 1: 접두사 / 접미사: 파일 확장자를 완벽히 보존하며 본문 앞뒤에 텍스트를 안전 결합 (예:
[1반]_+ 과제 +_제출). - Mode 2: 시퀀스 번호 매기기:
file_###패턴을 입력하면#의 개수를 세어 자릿수에 맞게 패딩된 번호(file_001.png,file_002.png)를 순차 부여. - Mode 3: 대소문자 통일: 전체 소문자, 전체 대문자, 또는 첫 글자만 대문자로 변환하는 Title Case 지원.
- Mode 4: 정규식 치환: 고급 사용자를 위해
(\d{4})_(\w+)패턴을$2_$1로 그룹 교환하는 정규표현식 지원.
switch (CmbMode.SelectedIndex)
{
case 0: // 1) 찾아 바꾸기
string find = TxtFind?.Text ?? "";
string replace = TxtReplaceTo?.Text ?? "";
if (!string.IsNullOrEmpty(find))
newName = originalName.Replace(find, replace, StringComparison.OrdinalIgnoreCase);
break;
case 1: // 2) 접두사 / 접미사
string prefix = TxtPrefix?.Text ?? "";
string suffix = TxtSuffix?.Text ?? "";
newName = prefix + nameWithoutExt + suffix + ext;
break;
case 2: // 3) 시퀀스 번호 (# 개수 기반 자릿수 패딩)
string pattern = TxtSeqPattern?.Text ?? "file_###";
int hashCount = pattern.Count(c => c == '#');
if (hashCount > 0)
{
string numStr = seq.ToString().PadLeft(hashCount, '0');
newName = pattern.Replace(new string('#', hashCount), numStr) + ext;
seq++;
}
break;
case 3: // 4) 대소문자 변환
int caseMode = CmbCase?.SelectedIndex ?? 0;
newName = caseMode switch
{
0 => originalName.ToLowerInvariant(),
1 => originalName.ToUpperInvariant(),
2 => string.IsNullOrEmpty(nameWithoutExt)
? originalName
: char.ToUpper(nameWithoutExt[0]) + nameWithoutExt.Substring(1).ToLower() + ext.ToLower(),
_ => originalName
};
break;
case 4: // 5) 정규표현식 치환
string regexPattern = TxtRegexPattern?.Text ?? "";
string regexReplace = TxtRegexReplace?.Text ?? "";
if (!string.IsNullOrEmpty(regexPattern))
{
try
{
newName = Regex.Replace(originalName, regexPattern, regexReplace, RegexOptions.IgnoreCase);
}
catch { newName = originalName; }
}
break;
}
4. 실시간 병렬 미리보기와 Path.GetInvalidFileNameChars 금지 문자 안전 방어벽
Windows 파일 시스템(NTFS/FAT32)에서는 \ / : * ? " < > | 등의 특수 문자를 파일 이름에 사용할 수 없습니다. 사용자가 치환 문자열에 실수로 콜론(`:`)이나 슬래시(`/`)를 넣는 순간 운영체제 레벨에서 치명적인 I/O 예외가 발생합니다.
ZeliRename은 Path.GetInvalidFileNameChars()를 실시간으로 대조하여 금지 문자가 발견되면 즉각 경고 라벨(⚠️)을 띄우고 **실행 버튼(BtnApply)을 원천 차단**하여 파일 시스템 크래시를 사전 방어합니다:
// 윈도우 금지 문자 검사 (\ / : * ? " < > |)
if (newName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
{
newName = "⚠️ " + newName + " " + Loc.Get("Rename_InvalidChars");
BtnApply.IsEnabled = false; // 실행 차단
}
_previews.Add(new RenamePreviewItem
{
OriginalName = originalName,
NewName = newName,
FullPath = path
});
// 모든 미리보기가 정상일 때만 실행 버튼 활성화
if (_previews.All(p => !p.NewName.StartsWith("⚠️")))
{
BtnApply.IsEnabled = true;
}
5. File.Exists 사전 검사 기반의 파일 덮어쓰기 및 충돌 원천 방지 알고리즘
배치 리네이밍 중 가장 끔찍한 사고는 **서로 다른 두 파일이 동일한 새 이름을 갖게 되는 충돌(Name Collision)**입니다. 예를 들어 시퀀스 규칙을 잘못 적용하여 이미 존재하는 파일명으로 변경을 시도하면, 기존 파일이 영구히 덮어써져 삭제될 위험이 있습니다.
ZeliRename은 File.Move를 실행하기 직전에 타겟 경로에 이미 파일이 존재하는지(File.Exists(newPath))를 선행 검사하여, 충돌이 감지되면 해당 파일의 수정을 안전하게 스킵하고 에러 카운트로 격리합니다:
string dir = Path.GetDirectoryName(item.FullPath);
string newPath = Path.Combine(dir, item.NewName);
try
{
// 동일한 이름의 파일이 이미 존재하는 경우 덮어쓰기 방지를 위해 즉시 스킵
if (File.Exists(newPath))
{
errorCount++;
continue;
}
File.Move(item.FullPath, newPath);
undoBatch.Add((newPath, item.FullPath)); // Undo용 (신규경로, 원래경로) 페어 기록
successCount++;
}
catch
{
errorCount++;
}
6. Stack<List<(Old, New)>> 가역적 원클릭 언두(Undo) 영속화 파이프라인
"아차, 1반 과제인데 2반으로 잘못 바꿨다!" 이 순간 교사나 행정 실무자는 패닉에 빠집니다. 수백 개 파일의 원래 이름을 기억해 낼 방법이 없기 때문입니다.
ZeliRename은 메모리 기반의 배치 언두 스택(Undo Stack)을 탑재하여 완벽한 가역성을 보장합니다. 실행이 성공한 모든 파일의 `(현재 경로, 원래 경로)` 튜플 리스트를 _undoStack.Push(undoBatch)에 영속화하며, 되돌리기(Undo) 버튼을 누르면 단 0초 만에 모든 파일이 100% 원래의 파일명으로 원상 복구됩니다:
private void BtnUndo_Click(object sender, RoutedEventArgs e)
{
if (_undoStack.Count == 0) return;
// 가장 최근 실행 배치 팝(Pop)
var batch = _undoStack.Pop();
int restored = 0;
foreach (var (currentPath, originalPath) in batch)
{
try
{
// 현재 파일이 존재하고, 원래 이름의 위치가 비어 있을 때만 완벽 복원
if (File.Exists(currentPath) && !File.Exists(originalPath))
{
File.Move(currentPath, originalPath);
restored++;
}
}
catch { }
}
if (_undoStack.Count == 0)
BtnUndo.Visibility = Visibility.Collapsed;
// 현재 작업 목록도 복원된 원래 경로로 재동기화
_filePaths.Clear();
foreach (var (_, originalPath) in batch)
{
if (File.Exists(originalPath)) _filePaths.Add(originalPath);
}
TxtStatus.Text = string.Format(Loc.Get("Rename_UndoComplete"), restored);
RefreshPreview();
}
7. 파일 일괄 변경 도구(Windows 탐색기 vs DarkNamer vs PowerToys PowerRename vs ZeliRename) 비교 분석
공교육 및 공공 기관의 실무 환경에서 기존 솔루션들과 비교한 기술 분석 결과는 다음과 같습니다:
| 비교 항목 | Windows 파일 탐색기 | DarkNamer (구형 셰어웨어) | MS PowerToys PowerRename | ZeliRename (온디바이스) |
|---|---|---|---|---|
| 배포 및 설치 방식 | OS 내장 | 단일 실행 파일 | 수백 MB 설치 패키지 (UAC 필수) | Zero-Install 무설치 네이티브 C# |
| 규칙 다양성 | 괄호 넘버링 (1), (2) 단일 | 문자열 자르기/붙이기 | 정규식 중심 (초보자 어려움) | 5대 모드 (초보자부터 정규식까지) |
| 금지 문자 사전 검증 | 미지원 (오류 팝업) | 일부 지원 | 지원 | Path.GetInvalidFileNameChars 차단 |
| 가역적 언두(Undo) 복원 | Ctrl+Z (불안정/일부 누락) | 미지원 (실수 시 복구 불가) | 미지원 | Stack 기반 100% 원클릭 Undo |
| 덮어쓰기 충돌 방지 | (1) 자동 붙임 | 에러 발생 후 중단 | 옵션 제공 | File.Exists 사전 검사로 안전 스킵 |
| 소프트웨어 라이선스 안전 | 무관 | 개발 중단 (보안 취약점) | 오픈소스 | 완전 무상 보급 / 100% 라이선스 프리 |
8. 결론: "상용 라이선스 단속과 과제물 유실 위험 없는 공교육·행정 현장의 필수 온디바이스 유틸리티"
파일을 정리하는 데 필요한 것은 복잡한 스크립트나 무거운 외부 프로그램이 아닙니다. 교사와 공공 실무자에게 진정으로 필요한 것은 "내 소중한 파일이 어떻게 바뀔지 한눈에 보이고, 설령 실수하더라도 단 한 번의 클릭으로 되돌릴 수 있다는 확신"입니다.
ZeliDesk의 ZeliRename은 가장 직관적인 5대 규칙과 철저한 금지 문자 방어벽, 그리고 스택 기반의 가역적 언두 엔진을 통해 파일 일괄 정리의 모든 불안 요소를 제거했습니다. 이제 전국의 선생님들과 국방·공공 실무자들은 과제물 정리에 낭비되던 소중한 시간을 절약하고 교육과 본연의 임무에 더욱 집중할 수 있습니다.