Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }