특정 업데이트 날짜 파일만 가져오는 도구를 만들었습니다

이것은 과거의 번거로운 업무 자동화의 노트다.
뭘 했어?
특정 날짜의 원본 파일 자동 수집
그리고 비밀번호가 있는 zip 파일화 도구입니다.
↓ 그렇군요.

원본 폴더를 가져오는 아래에서 업데이트 날짜 '파일 업데이트 날짜 가져오기' 에 지정한 날짜의 파일을 지정합니다.
각 디렉토리를 저장된 대상 폴더로 복사합니다.
지정이 있으면 zip화합니다.그렇게 말해도 돼.
배경 만들기
어떤 위탁 항목에서는 거의 매일 그날의 성과(원본 파일)를 고객에게 보내는 업무가 있다.
그때 회사 내부의 자원 관리는 주로 TFS였는데 50개 이상의 프로젝트 파일을 모은 해결 방안을 관리하고 있었다.
매일 퇴근 전
  • 당일 수정 또는 제작된 원본 파일은 구성원의 보고 또는 소화된 표와 차이가 없음
  • 확인
  • 차별화된 소스 파일만 가져오기
  • zip화 후 발송
    이런 일이지만...
  • 그 일은 뜻밖에도 전부 수공으로 완성되었다.
    이 일이 내 차례가 되었을 때 나는 비로소 처음으로 이런 상황을 깨달았지만, 나는 이런 마음으로 적어도 원본 서류를 수집해야 한다.
    소스(핵심 부분)
    ※ Windows 포맷으로 제작원본 전문 여기 있습니다.
    대상 파일을 디렉터리와 함께 복사 CopyFileWithDirectory 는 함수만 호출합니다.
    실행할 때 이상한 경로를 지정하는 것도 곤란하기 때문에 시스템 폴더와bin 등 특정 폴더는 최소한으로 떼어낸다.
            /// <summary>
            /// ディレクトリ構成を含め、再帰的に対象ファイルをコピーする
            /// </summary>
            /// <param name="originDirectory">取得元フォルダ</param>
            /// <param name="targetDirectory">保存先フォルダ</param>
            /// <param name="targetDateFrom">取得ファイル更新日付(From)</param>
            /// <param name="targetDateTo">取得ファイル更新日付(To)</param>
            private void CopyFileWithDirectory(string originDirectory
                                                , string targetDirectory
                                                , DateTime targetDateFrom
                                                , DateTime targetDateTo)
            {
                // 保存先のディレクトリ名の末尾に"\"をつける
                if (targetDirectory[targetDirectory.Length - 1] != Path.DirectorySeparatorChar)
                    targetDirectory = targetDirectory + Path.DirectorySeparatorChar;
    
                try
                {
                    // タスクのキャンセルがされていたら例外を投げる
                    _cancellationToken.ThrowIfCancellationRequested();
    
                    // 取得元ディレクトリ配下のファイルを検索し、条件に一致するファイルを取得する
                    string[] files = Directory.GetFiles(originDirectory);
                    foreach (string file in files)
                    {
                        // 処理中のディレクトリを画面に表示
                        Invoke(new Action<string>(SetExecuteMsg), file);
    
                        if (!CheckTargetFile(file, targetDateFrom, targetDateTo))
                            continue;
    
                        // 保存先のディレクトリがないときは作る(属性もコピー)
                        if (!Directory.Exists(targetDirectory))
                        {
                            Directory.CreateDirectory(targetDirectory);
                            File.SetAttributes(targetDirectory, File.GetAttributes(originDirectory));
                        }
    
                        File.Copy(file, targetDirectory + Path.GetFileName(file), true);
                    }
    
                    // 取得元ディレクトリ配下のディレクトリについて、再帰的に呼び出す
                    string[] dirs = Directory.GetDirectories(originDirectory);
                    foreach (string dir in dirs)
                    {
                        if (!CheckTargetFolder(dir))
                            continue;
    
                        CopyFileWithDirectory(dir
                                                , targetDirectory + Path.GetFileName(dir)
                                                , targetDateFrom
                                                , targetDateTo);
                    }
    
                }
                catch (UnauthorizedAccessException ex)
                {
                    string[] msg = ex.Message.Split('\'');
    
                    Invoke(new Action<string>(SetErrMsg), "権限エラー:" + msg[1]);
                }
                catch (OperationCanceledException)
                {
                    // 処理なし
                    // 処理キャンセルのメッセージは呼び出し元でセットする
                }
                catch (Exception ex)
                {
                    Invoke(new Action<string>(SetErrMsg), ex.Message);
                }
            }
    
            /// <summary>
            /// ファイルの取得判定
            /// </summary>
            /// <param name="file"></param>
            /// <param name="targetDateFrom">取得ファイル更新日付(From)</param>
            /// <param name="targetDateTo">取得ファイル更新日付(To)</param>
            /// <returns></returns>
            private static bool CheckTargetFile(string file, DateTime targetDateFrom, DateTime targetDateTo)
            {
                // 存在チェック
                if (!File.Exists(file))
                    return false;
    
                // 属性チェック
                // 非表示、システムファイルは除外
                FileAttributes attributes = File.GetAttributes(file);
                if ((attributes & FileAttributes.System) == FileAttributes.System
                    || (attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                    return false;
    
                // 対象日付範囲チェック
                DateTime lastWriteDateTime = File.GetLastWriteTime(file);
                if (lastWriteDateTime.Date < targetDateFrom.Date || targetDateTo.Date < lastWriteDateTime.Date)
                    return false;
    
                return true;
            }
    
            /// <summary>
            /// フォルダの対象判定
            /// </summary>
            /// <param name="dir">取得元フォルダ</param>
            /// <returns></returns>
            private static bool CheckTargetFolder(string dir)
            {
                string[] arr = dir.Split('\\');
                string strLastDir = arr[arr.Length - 1];
    
                // 非表示、システムフォルダは除外
                FileAttributes attributes = File.GetAttributes(dir);
                if ((attributes & FileAttributes.System) == FileAttributes.System
                    || (attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                    return false;
    
                // 特定フォルダ名は除外
                if (strLastDir == "bin"
                    || strLastDir == "obj"
                    || strLastDir == "Program Files"
                    || strLastDir == "Program Files (x86)"
                    || strLastDir == "Windows")
                    return false;
    
                return true;
            }
    
    
    최후
    덕분에 나는 대상을 찾으려고 애쓰는 서류를 반복해서 복사한 끝에 부족한 업무에서 해방된 적이 있는지 다시 확인했다.
    측정은 안 해봤지만 한 번에 20분 정도 일을 줄일 수 있겠죠.일주일에 5명이 하루에 100분, 한 달에 400분≈6~7시간가량 걸리는 셈이다.
    기존 도구를 찾거나 TFS 기능을 활용하는 등 좀 더 똑똑한 방법이 있어야 한다고 생각했는데 제작 도구가 재미있어서 좋았다.

    좋은 웹페이지 즐겨찾기