private void DoCategories() { if (0 >= fileListView.Items.Count) { MessageBox.Show("작업할 파일이 없습니다."); return; } DirectoryInfo destDirectory; FileInfo fileInfo; String sourceFilePath; String destFilePath; bool isDoneWork = false; int skipCnt = 0; FormOverwriteDlg overwriteDlg = new FormOverwriteDlg(); RawFileList rawFileList = new RawFileList(); List <String> jpgFileList = null; List <FileInfo> deleteFileList = new List <FileInfo>(); // [JPG 파일이 없으면 RAW 파일 삭제] 옵션 선택시 RAW파일과 경로 및 파일명 비교를 위해 JPG 파일 리스트를 미리 가져온다 if (true == chkDelRawIfJpgNotExist.Checked) { jpgFileList = GetJpgFileList(fileListView); } foreach (ListViewItem item in fileListView.Items) { // 이미 작업한 항목은 Skip 한다. if (true == item.SubItems[1].Text.Equals("O")) { continue; } sourceFilePath = item.SubItems[2].Text; fileInfo = new FileInfo(sourceFilePath); // 파일이 존재하지 않으면 skip if (false == fileInfo.Exists) { continue; } // [JPG 파일이 없으면 RAW 파일 삭제] 옵션 선택시 RAW파일인 경우 삭제 리스트에 넣는다. // 위 옵션을 켰더라도 RAW 파일만 목록에 있는 경우도 있다. 이 때는 RAW파일만 정리가 목적이므로 이 옵션을 수행하지 않는다. if (null != jpgFileList) { if (true == chkDelRawIfJpgNotExist.Checked && rawFileList.IsContain(fileInfo.Extension)) { String lookUpName = fileInfo.FullName.Replace(fileInfo.Extension, "") + ".jpg"; String lookResult = jpgFileList.Find(jpg => lookUpName.ToLower().Equals(jpg.ToLower())); if (true == String.IsNullOrEmpty(lookResult)) { deleteFileList.Add(fileInfo); MarkingCompleteItem(item); continue; } } } // 아래 {}블럭은 작업 완료 후에 더 이상 필요없는 값들이므로{}블럭 처리하여 지역변수로 세팅한 것이다. // 그러면 블럭 이후에는 메모리를 반환되는 장점이 있어 의도적인 처리이다. { StringBuilder destDirectoryName = new StringBuilder(fileInfo.DirectoryName); if (true == chkMakeRoot.Checked) { destDirectoryName.Append("\\Category"); } destDirectoryName.Append("\\"); String destFolderName; // 파일 생성날짜를 가져온다. (폴더명으로 쓰기 위함) destFolderName = item.SubItems[3].Text; // 사진을 월단위로 분류 한다. if (true == chkCategoryByMonth.Checked) { destFolderName = destFolderName.Substring(0, 7); } // 옵션에 따라 날짜형식에 "-"를 포함하지 않는다. if (false == chkUseDash.Checked) { destFolderName = destFolderName.Replace("-", ""); } // 옵션에 따라 날짜 형식을 4자리 또는 2자리로 사용한다. if (false == chkDateFormat.Checked) { destFolderName = destFolderName.Substring(2); } destDirectoryName.Append(destFolderName); if (true == chkSepertateRawFile.Checked) { if (true == rawFileList.IsContain(fileInfo.Extension)) { destDirectoryName.Append("\\Raw"); } } destDirectory = new DirectoryInfo(destDirectoryName.ToString()); // 대상 디렉토리가 존재하지 않는 경우에는 생성한다. if (false == destDirectory.Exists) { destDirectory.Create(); } } // 대상 파일 경로를 생성. destFilePath = destDirectory.ToString() + "\\"; if (true == chkChangeFileName.Checked) { destFilePath += GetExifDateFileName(sourceFilePath); } else { destFilePath += fileInfo.Name; } destFilePath = destFilePath.Replace("\\\\", "\\"); // 대상 경로에 동일한 파일이 존재하면 덮어쓰기 다이얼로그를 띄운다. try { if (true == File.Exists(destFilePath)) { OverwriteResult overWriteResult = OverwriteResult.Cancel; overWriteResult = overwriteDlg.ShowOverwriteDialog(sourceFilePath, destFilePath); switch (overWriteResult) { case OverwriteResult.Overwrite: // 덮어쓰기 File.Delete(destFilePath); break; case OverwriteResult.NotMove: // 이동 안 함 skipCnt++; continue; case OverwriteResult.Rename: // 이름변경하여 이동 destFilePath = GPUtil.GetNewTargetName(destFilePath); break; case OverwriteResult.Cancel: //취소 return; } } File.Move(sourceFilePath, destFilePath); isDoneWork = true; MarkingCompleteItem(item); workItems.removeItem(sourceFilePath); } catch (IOException ex) { MessageBox.Show(String.Format("다른 곳에서 파일이 사용 중입니다.\n\n{0}", destFilePath), "오류", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (true == chkAutoDeleteDoneItem.Checked) { item.Remove(); } } // end of foreach // 삭제할 파일이 존재하는 경우에 대한 처리 if (0 < deleteFileList.Count) { ProcessFileDelete(deleteFileList); } if (true == isDoneWork) { MessageBox.Show("작업 완료", "Groupic"); } else if (false == isDoneWork && (skipCnt != fileListView.Items.Count)) { MessageBox.Show("이미 작업이 완료된 파일들 입니다.", "Groupic"); } isDoneWork = false; }
private void DoCategories() { if (0 >= fileListView.Items.Count) { MessageBox.Show("작업할 파일이 없습니다."); return; } DirectoryInfo destDirectory; FileInfo fileInfo; String sourceFilePath; String destFilePath; bool isDoneWork = false; int skipCnt = 0; FormOverwriteDlg overwriteDlg = new FormOverwriteDlg(); RawFileList rawFileList = new RawFileList(); List<String> jpgFileList = null; List<FileInfo> deleteFileList = new List<FileInfo>(); // [JPG 파일이 없으면 RAW 파일 삭제] 옵션 선택시 RAW파일과 경로 및 파일명 비교를 위해 JPG 파일 리스트를 미리 가져온다 if (true == chkDelRawIfJpgNotExist.Checked) jpgFileList = GetJpgFileList(fileListView); foreach (ListViewItem item in fileListView.Items) { // 이미 작업한 항목은 Skip 한다. if (true == item.SubItems[1].Text.Equals("O")) continue; sourceFilePath = item.SubItems[2].Text; fileInfo = new FileInfo(sourceFilePath); // 파일이 존재하지 않으면 skip if (false == fileInfo.Exists) continue; // [JPG 파일이 없으면 RAW 파일 삭제] 옵션 선택시 RAW파일인 경우 삭제 리스트에 넣는다. // 위 옵션을 켰더라도 RAW 파일만 목록에 있는 경우도 있다. 이 때는 RAW파일만 정리가 목적이므로 이 옵션을 수행하지 않는다. if (null != jpgFileList) { if (true == chkDelRawIfJpgNotExist.Checked && rawFileList.IsContain(fileInfo.Extension)) { String lookUpName = fileInfo.FullName.Replace(fileInfo.Extension, "") + ".jpg"; String lookResult = jpgFileList.Find(jpg => lookUpName.ToLower().Equals(jpg.ToLower())); if (true == String.IsNullOrEmpty(lookResult)) { deleteFileList.Add(fileInfo); MarkingCompleteItem(item); continue; } } } // 아래 {}블럭은 작업 완료 후에 더 이상 필요없는 값들이므로{}블럭 처리하여 지역변수로 세팅한 것이다. // 그러면 블럭 이후에는 메모리를 반환되는 장점이 있어 의도적인 처리이다. { StringBuilder destDirectoryName = new StringBuilder(fileInfo.DirectoryName); if (true == chkMakeRoot.Checked) destDirectoryName.Append("\\Category"); destDirectoryName.Append("\\"); String destFolderName; // 파일 생성날짜를 가져온다. (폴더명으로 쓰기 위함) destFolderName = item.SubItems[3].Text; // 사진을 월단위로 분류 한다. if (true == chkCategoryByMonth.Checked) destFolderName = destFolderName.Substring(0, 7); // 옵션에 따라 날짜형식에 "-"를 포함하지 않는다. if (false == chkUseDash.Checked) destFolderName = destFolderName.Replace("-", ""); // 옵션에 따라 날짜 형식을 4자리 또는 2자리로 사용한다. if (false == chkDateFormat.Checked) destFolderName = destFolderName.Substring(2); destDirectoryName.Append(destFolderName); if (true == chkSepertateRawFile.Checked) { if (true == rawFileList.IsContain(fileInfo.Extension)) destDirectoryName.Append("\\Raw"); } destDirectory = new DirectoryInfo(destDirectoryName.ToString()); // 대상 디렉토리가 존재하지 않는 경우에는 생성한다. if (false == destDirectory.Exists) { destDirectory.Create(); } } // 대상 파일 경로를 생성. destFilePath = destDirectory.ToString() + "\\"; if (true == chkChangeFileName.Checked) destFilePath += GetExifDateFileName(sourceFilePath); else destFilePath += fileInfo.Name; destFilePath = destFilePath.Replace("\\\\", "\\"); // 대상 경로에 동일한 파일이 존재하면 덮어쓰기 다이얼로그를 띄운다. try { if (true == File.Exists(destFilePath)) { OverwriteResult overWriteResult = OverwriteResult.Cancel; overWriteResult = overwriteDlg.ShowOverwriteDialog(sourceFilePath, destFilePath); switch (overWriteResult) { case OverwriteResult.Overwrite: // 덮어쓰기 File.Delete(destFilePath); break; case OverwriteResult.NotMove: // 이동 안 함 skipCnt++; continue; case OverwriteResult.Rename: // 이름변경하여 이동 destFilePath = GPUtil.GetNewTargetName(destFilePath); break; case OverwriteResult.Cancel: //취소 return; } } File.Move(sourceFilePath, destFilePath); isDoneWork = true; MarkingCompleteItem(item); } catch (IOException ex) { MessageBox.Show(String.Format("다른 곳에서 파일이 사용 중입니다.\n\n{0}", destFilePath), "오류", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (true == chkAutoDeleteDoneItem.Checked) item.Remove(); } // end of foreach // 삭제할 파일이 존재하는 경우에 대한 처리 if (0 < deleteFileList.Count) { ProcessFileDelete(deleteFileList); } if (true == isDoneWork) MessageBox.Show("작업 완료", "Groupic"); else if (false == isDoneWork && (skipCnt != fileListView.Items.Count)) MessageBox.Show("이미 작업이 완료된 파일들 입니다.", "Groupic"); isDoneWork = false; }