개인적인 용도로 파일명과 확장자를 일괄변환하는 툴을 만들어 보았습니다. 파일명을 특정 디렉토리에 지정된 이름으로 복사하는 툴입니다.
역시 급조해서 만들어 테스트와 예외처리가 부족하여 어플리케이션 자체는 올리지 않습니다. (이런 용도로 다른 좋은 툴들이 많이 있을 것 같네요) 프로젝트 파일만 업로드하니 비슷한 작업을 하실 분이 계시면 다운로드 받으셔서 용도에 맞게 수정하고 엉성한 부분을 보강하여 사용하시면 될 것 같습니다.
역시 급조해서 만들어 테스트와 예외처리가 부족하여 어플리케이션 자체는 올리지 않습니다. (이런 용도로 다른 좋은 툴들이 많이 있을 것 같네요) 프로젝트 파일만 업로드하니 비슷한 작업을 하실 분이 계시면 다운로드 받으셔서 용도에 맞게 수정하고 엉성한 부분을 보강하여 사용하시면 될 것 같습니다.
(매번 이런 말씀 송구스럽지만 역시나 이 소스 사용으로 인한
어떠한 결과에 대해서는 책임을 지지 못합니다)
어떠한 결과에 대해서는 책임을 지지 못합니다)
#import <Cocoa/Cocoa.h>
@interface AppController : NSObject {
IBOutlet NSTableView *fileList;
IBOutlet NSTextField *targetDirectory;
IBOutlet NSTextField *preName;
IBOutlet NSComboBox *numberFormat;
IBOutlet NSTextField *startNumber;
IBOutlet NSComboBox *extensionStyle;
IBOutlet NSTextField *extensionName;
IBOutlet NSProgressIndicator *progressBar;
NSMutableArray *fileArray;
}
- (IBAction) addFile:(id)sender;
- (IBAction) removeFile:(id)sender;
- (IBAction) setPath:(id)sender;
- (IBAction) changeName:(id)sender;
- (IBAction) setExtesionStyle:(id)sender;
- (void) showAlert:(NSString*) message;
- (BOOL) checkDuplicate:(NSString *)str;
@end
@interface AppController : NSObject {
IBOutlet NSTableView *fileList;
IBOutlet NSTextField *targetDirectory;
IBOutlet NSTextField *preName;
IBOutlet NSComboBox *numberFormat;
IBOutlet NSTextField *startNumber;
IBOutlet NSComboBox *extensionStyle;
IBOutlet NSTextField *extensionName;
IBOutlet NSProgressIndicator *progressBar;
NSMutableArray *fileArray;
}
- (IBAction) addFile:(id)sender;
- (IBAction) removeFile:(id)sender;
- (IBAction) setPath:(id)sender;
- (IBAction) changeName:(id)sender;
- (IBAction) setExtesionStyle:(id)sender;
- (void) showAlert:(NSString*) message;
- (BOOL) checkDuplicate:(NSString *)str;
@end
#import "AppController.h"
@implementation AppController
/** 파일확장자 변경 옵션 */
enum {
etNotChange = 0,
etLowerCase = 1,
etUpperCase = 2,
etUser = 3
};
#pragma mark '초기화/종료'
- (id) init {
self = [super init];
if (self != nil) {
fileArray = [[NSMutableArray alloc] init];
}
return self;
}
- (void) dealloc {
[fileArray release];
[super dealloc];
}
- (void) awakeFromNib {
[numberFormat selectItemAtIndex:0];
[extensionStyle selectItemAtIndex:0];
}
#pragma mark '유틸리티'
/** 메시지 출력 */
- (void) showAlert:(NSString*) message {
NSBeginAlertSheet([NSString stringWithUTF8String:"알림"],
[NSString stringWithUTF8String:"확인"],
nil, nil, [NSApp mainWindow], self,
NULL, NULL, NULL, message);
}
/** 파일목록 중복 검사 */
- (BOOL) checkDuplicate:(NSString *)str {
int i, count = [fileArray count];
for (i = 0; i < count; i++) {
NSString* curFile = [fileArray objectAtIndex:i];
if ([curFile isEqualToString:str]) {
return TRUE;
}
}
return FALSE;
}
#pragma mark '변경 실행'
- (IBAction) changeName:(id)sender {
int totalFile = [fileArray count];
if (totalFile < 1) {
[self showAlert: [NSString stringWithUTF8String:"변경할 파일을 선택해 주세요."]];
return;
}
// 디렉토리 입력 확인
NSString *targetString = [targetDirectory stringValue];
if ([targetString length] == 0) {
[self showAlert: [NSString stringWithUTF8String:"디렉토리를 선택해 주세요."]];
return;
}
// 입력된 디렉토리가 유효한지 검사
BOOL isDirectory;
NSFileManager *fileManager = [NSFileManager defaultManager];
if (!([fileManager fileExistsAtPath:targetString isDirectory:&isDirectory] && isDirectory)) {
[self showAlert: [NSString stringWithUTF8String:"설정된 디렉토리를 찾을 수 없습니다."]];
return;
}
// 파일명 입력 확인
NSString *fileName = [preName stringValue];
if ([fileName length] == 0) {
[self showAlert: [NSString stringWithUTF8String:"파일명을 입력해 주세요."]];
return;
}
// 시작 숫자 설정
int startNum = [startNumber intValue];
int numberType = [numberFormat indexOfSelectedItem];
// 확장자 검사
NSString *extName = [extensionName stringValue];
int extensionType = [extensionStyle indexOfSelectedItem];
if (extensionType == etUser) {
if ([extName length] == 0) {
[self showAlert: [NSString stringWithUTF8String:"확장자명을 입력해 주세요."]];
return;
}
}
/** 처리 */
char curNumber[128];
int i;
[progressBar startAnimation:self];
for (i = 0; i < totalFile; i++) {
NSString* sourceFile = [fileArray objectAtIndex:i];
NSString* targetExt;
// 파일 확장자 설정
if (extensionType == etLowerCase)
targetExt = [[sourceFile pathExtension] lowercaseString];
else if (extensionType == etUpperCase)
targetExt = [[sourceFile pathExtension] uppercaseString];
else if (extensionType == etUser)
targetExt = extName;
else
targetExt = [sourceFile pathExtension];
// 넘버링
if (numberType == 0)
sprintf(curNumber, "%d", startNum);
else if (numberType == 1)
sprintf(curNumber, "%02d", startNum);
else if (numberType == 2)
sprintf(curNumber, "%03d", startNum);
else if (numberType == 3)
sprintf(curNumber, "%04d", startNum);
else if (numberType == 4)
sprintf(curNumber, "%05d", startNum);
// 파일명 설정
NSString* targetFile = [NSString stringWithFormat:@"%@/%@_%s%s%@",
targetString, fileName, curNumber, ([targetExt length] > 0) ? "." : "", targetExt];
// 복사
[fileManager copyPath:sourceFile toPath:targetFile
handler:nil];
startNum++;
}
[progressBar stopAnimation:self];
[self showAlert: [NSString stringWithUTF8String:"변경이 완료되었습니다."]];
}
#pragma mark '파일추가/삭제'
/** 파일 추가 */
- (IBAction) addFile:(id)sender {
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseFiles:YES];
[openPanel setAllowsMultipleSelection:YES];
[openPanel setCanChooseDirectories:NO];
if ([openPanel runModalForDirectory:NSHomeDirectory()
file:nil types:nil] == NSOKButton) {
int i, count;
NSArray *files = [openPanel filenames];
count = [files count];
for (i = 0; i < count; i++) {
NSString *str = [files objectAtIndex:i];
if ([self checkDuplicate:str] == FALSE) {
[fileArray addObject:str];
}
}
[fileList reloadData];
}
}
/** 선택 파일 삭제 */
- (IBAction) removeFile:(id)sender {
NSIndexSet *selected = [fileList selectedRowIndexes];
unsigned int index = [selected lastIndex];
while (index != NSNotFound) {
[fileArray removeObjectAtIndex:index];
index = [selected indexLessThanIndex: index];
}
[fileList reloadData];
}
#pragma mark '컨트롤 처리'
/** 파일이 복사될 디렉토리 설정 */
- (IBAction) setPath:(id)sender {
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseFiles:NO];
[openPanel setCanChooseDirectories:YES];
[openPanel setCanCreateDirectories:YES];
if ([openPanel runModalForDirectory:NSHomeDirectory()
file:nil types:nil] == NSOKButton) {
NSArray *directory = [openPanel filenames];
if([directory count] == 1) {
[targetDirectory setStringValue: [directory objectAtIndex:0]];
}
}
}
/** 확장자 입력창 활성화 설정 */
- (IBAction) setExtesionStyle:(id)sender {
// 현재 선택이 '다음과 같이'일 경우에만 텍스트필드를 활성화
BOOL isEnabled = FALSE;
if ([sender indexOfSelectedItem] == etUser)
isEnabled = TRUE;
[extensionName setEnabled:isEnabled];
}
- (int) numberOfRowsInTableView:(NSTableView *)tableView {
return [fileArray count];
}
/** 테이블뷰 데이터 설정 */
- (id) tableView:(NSTableView *)tableView
objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row {
if (row >= 0 && row < [fileArray count]) {
return [fileArray objectAtIndex:row];
}
return nil;
}
@end
@implementation AppController
/** 파일확장자 변경 옵션 */
enum {
etNotChange = 0,
etLowerCase = 1,
etUpperCase = 2,
etUser = 3
};
#pragma mark '초기화/종료'
- (id) init {
self = [super init];
if (self != nil) {
fileArray = [[NSMutableArray alloc] init];
}
return self;
}
- (void) dealloc {
[fileArray release];
[super dealloc];
}
- (void) awakeFromNib {
[numberFormat selectItemAtIndex:0];
[extensionStyle selectItemAtIndex:0];
}
#pragma mark '유틸리티'
/** 메시지 출력 */
- (void) showAlert:(NSString*) message {
NSBeginAlertSheet([NSString stringWithUTF8String:"알림"],
[NSString stringWithUTF8String:"확인"],
nil, nil, [NSApp mainWindow], self,
NULL, NULL, NULL, message);
}
/** 파일목록 중복 검사 */
- (BOOL) checkDuplicate:(NSString *)str {
int i, count = [fileArray count];
for (i = 0; i < count; i++) {
NSString* curFile = [fileArray objectAtIndex:i];
if ([curFile isEqualToString:str]) {
return TRUE;
}
}
return FALSE;
}
#pragma mark '변경 실행'
- (IBAction) changeName:(id)sender {
int totalFile = [fileArray count];
if (totalFile < 1) {
[self showAlert: [NSString stringWithUTF8String:"변경할 파일을 선택해 주세요."]];
return;
}
// 디렉토리 입력 확인
NSString *targetString = [targetDirectory stringValue];
if ([targetString length] == 0) {
[self showAlert: [NSString stringWithUTF8String:"디렉토리를 선택해 주세요."]];
return;
}
// 입력된 디렉토리가 유효한지 검사
BOOL isDirectory;
NSFileManager *fileManager = [NSFileManager defaultManager];
if (!([fileManager fileExistsAtPath:targetString isDirectory:&isDirectory] && isDirectory)) {
[self showAlert: [NSString stringWithUTF8String:"설정된 디렉토리를 찾을 수 없습니다."]];
return;
}
// 파일명 입력 확인
NSString *fileName = [preName stringValue];
if ([fileName length] == 0) {
[self showAlert: [NSString stringWithUTF8String:"파일명을 입력해 주세요."]];
return;
}
// 시작 숫자 설정
int startNum = [startNumber intValue];
int numberType = [numberFormat indexOfSelectedItem];
// 확장자 검사
NSString *extName = [extensionName stringValue];
int extensionType = [extensionStyle indexOfSelectedItem];
if (extensionType == etUser) {
if ([extName length] == 0) {
[self showAlert: [NSString stringWithUTF8String:"확장자명을 입력해 주세요."]];
return;
}
}
/** 처리 */
char curNumber[128];
int i;
[progressBar startAnimation:self];
for (i = 0; i < totalFile; i++) {
NSString* sourceFile = [fileArray objectAtIndex:i];
NSString* targetExt;
// 파일 확장자 설정
if (extensionType == etLowerCase)
targetExt = [[sourceFile pathExtension] lowercaseString];
else if (extensionType == etUpperCase)
targetExt = [[sourceFile pathExtension] uppercaseString];
else if (extensionType == etUser)
targetExt = extName;
else
targetExt = [sourceFile pathExtension];
// 넘버링
if (numberType == 0)
sprintf(curNumber, "%d", startNum);
else if (numberType == 1)
sprintf(curNumber, "%02d", startNum);
else if (numberType == 2)
sprintf(curNumber, "%03d", startNum);
else if (numberType == 3)
sprintf(curNumber, "%04d", startNum);
else if (numberType == 4)
sprintf(curNumber, "%05d", startNum);
// 파일명 설정
NSString* targetFile = [NSString stringWithFormat:@"%@/%@_%s%s%@",
targetString, fileName, curNumber, ([targetExt length] > 0) ? "." : "", targetExt];
// 복사
[fileManager copyPath:sourceFile toPath:targetFile
handler:nil];
startNum++;
}
[progressBar stopAnimation:self];
[self showAlert: [NSString stringWithUTF8String:"변경이 완료되었습니다."]];
}
#pragma mark '파일추가/삭제'
/** 파일 추가 */
- (IBAction) addFile:(id)sender {
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseFiles:YES];
[openPanel setAllowsMultipleSelection:YES];
[openPanel setCanChooseDirectories:NO];
if ([openPanel runModalForDirectory:NSHomeDirectory()
file:nil types:nil] == NSOKButton) {
int i, count;
NSArray *files = [openPanel filenames];
count = [files count];
for (i = 0; i < count; i++) {
NSString *str = [files objectAtIndex:i];
if ([self checkDuplicate:str] == FALSE) {
[fileArray addObject:str];
}
}
[fileList reloadData];
}
}
/** 선택 파일 삭제 */
- (IBAction) removeFile:(id)sender {
NSIndexSet *selected = [fileList selectedRowIndexes];
unsigned int index = [selected lastIndex];
while (index != NSNotFound) {
[fileArray removeObjectAtIndex:index];
index = [selected indexLessThanIndex: index];
}
[fileList reloadData];
}
#pragma mark '컨트롤 처리'
/** 파일이 복사될 디렉토리 설정 */
- (IBAction) setPath:(id)sender {
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseFiles:NO];
[openPanel setCanChooseDirectories:YES];
[openPanel setCanCreateDirectories:YES];
if ([openPanel runModalForDirectory:NSHomeDirectory()
file:nil types:nil] == NSOKButton) {
NSArray *directory = [openPanel filenames];
if([directory count] == 1) {
[targetDirectory setStringValue: [directory objectAtIndex:0]];
}
}
}
/** 확장자 입력창 활성화 설정 */
- (IBAction) setExtesionStyle:(id)sender {
// 현재 선택이 '다음과 같이'일 경우에만 텍스트필드를 활성화
BOOL isEnabled = FALSE;
if ([sender indexOfSelectedItem] == etUser)
isEnabled = TRUE;
[extensionName setEnabled:isEnabled];
}
- (int) numberOfRowsInTableView:(NSTableView *)tableView {
return [fileArray count];
}
/** 테이블뷰 데이터 설정 */
- (id) tableView:(NSTableView *)tableView
objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row {
if (row >= 0 && row < [fileArray count]) {
return [fileArray objectAtIndex:row];
}
return nil;
}
@end
'습작 소프트웨어' 카테고리의 다른 글
맥용 타자 게임 - 덕수리 1.0 [정식] (13) | 2008.05.08 |
---|---|
광고 차단툴 - AntiAD (7) | 2008.04.18 |
맥 OS X용 올블로그 실시간 인기글 위젯 수정본 (2) | 2008.02.26 |
티돌이(티스토리 알리미) 윈도우 버젼 (4) | 2008.02.06 |
티돌이 1.0B (24) | 2008.01.07 |