public bool Build(string rawLog, FileOperateLog newLog)
        {
            // 각 필드로 쪼개기
            string[] fields = rawLog.Split(fieldSeparator, StringSplitOptions.None);

            for (int i = 0; i < fields.Length; i++)
            {
                fields[i] = fields[i].Trim(charsToTrim);
            }

            if (fields.Length < logFieldCount)
            {
                return(false);
            }

            // 로그 구조화
            newLog.TimeOfDay = fields[(int)FieldIndex.TimeOfDay];
            newLog.ThreadId  = fields[(int)FieldIndex.ThreadId];
            newLog.Type      = fields[(int)FieldIndex.OperationType];
            newLog.FilePath  = fields[(int)FieldIndex.FilePath];
            newLog.Result    = fields[(int)FieldIndex.Result];
            newLog.Detail    = fields[(int)FieldIndex.Detail];

            return(true);
        }
        public TrackOpenFileItem(FileOperateLog log)
        {
            TimeOfDay = log.TimeOfDay;
            ThreadId  = log.ThreadId;
            Type      = log.Type;
            FilePath  = log.FilePath;
            Result    = log.Result;
            Detail    = log.Detail;

            OpenCount = 1;
        }
Пример #3
0
        private void btStart_Click(object sender, EventArgs e)
        {
            FileOperateLogBuilder logBuilder = new FileOperateLogBuilder();
            Dictionary <String, TrackOpenFileItem> trackOpenFileDictionary = new Dictionary <string, TrackOpenFileItem>();
            StreamReader logReader = null;

            // 전체 리포팅 뷰 초기화
            ClearView();

            // 통계정보 초기화
            trackMaxOpenedFileCount       = 0;
            outputReportCount             = 0;
            openedButNotClosedReportCount = 0;
            closedButTryingWriteCount     = 0;
            handledByMuliTreadCount       = 0;

            // 로그 파일 전체 읽기
            string logPath = GetLogPathFromUser();

            if (logPath == null)
            {
                return;
            }

            // 처리할 로그 파일 경로 UI에 표시
            logPathView.Text = "Log Path :" + logPath;


            try
            {
                logReader = new StreamReader(logPath);

                // 로그 파일 첫째 줄에 있는 헤더 정보는 패스
                string rawLog = logReader.ReadLine();

                while (logReader.Peek() >= 0)
                {
                    // 하나의 파일 연산 로그 읽기
                    rawLog = logReader.ReadLine();

                    FileOperateLog fileOperateLog = new FileOperateLog();

                    // 하나의 파일 연산 로그 구조화
                    if (logBuilder.Build(rawLog, fileOperateLog) == false)
                    {
                        continue;
                    }

                    // 분석 대상 파일여부 확인 (폴더, OS파일, exe, dll 분석 대상에서 제외)
                    if (!FileChecker.IsTargetFileForAnalysis(fileOperateLog.FilePath, fileOperateLog.Result, fileOperateLog.Detail))
                    {
                        continue;
                    }

                    // 각 파일 연산 별 처리
                    if (fileOperateLog.Type == "CreateFile")
                    {
                        ProcessOpenFileLog(trackOpenFileDictionary, fileOperateLog);
                    }
                    else if (fileOperateLog.Type == "CloseFile")
                    {
                        ProcessCloseFileLog(trackOpenFileDictionary, fileOperateLog);
                    }
                    else if (fileOperateLog.Type == "WriteFile")
                    {
                        ProcessWriteFileLog(trackOpenFileDictionary, fileOperateLog);
                    }
                    else
                    {
                        // Do not process others.
                    }
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine("The process failed: {0}", exception.ToString());
            }
            finally
            {
                if (logReader != null)
                {
                    logReader.Dispose();
                }
            }

            // 열고 닫지 않은 파일 확인
            foreach (var item in trackOpenFileDictionary.ToList())
            {
                opendButNotClosedReporter.AppendText("- " + item.Value.ToKeyString() + "\r\n");
                openedButNotClosedReportCount++;
            }

            // 통계정보 출력
            outputView.AppendText("- 동시에 열린 파일 개수 최대치 : " + trackMaxOpenedFileCount + "\r\n");
            outputReportCount++;

            outputView.AppendText("Total = " + outputReportCount + "\r\n");
            opendButNotClosedReporter.AppendText("Total = " + openedButNotClosedReportCount + "\r\n");
            closedButTryingWriteReport.AppendText("Total = " + closedButTryingWriteCount + "\r\n");
        }
Пример #4
0
        private void ProcessWriteFileLog(Dictionary <String, TrackOpenFileItem> trackOpenFileDictionary, FileOperateLog fileOperateLog)
        {
            TrackOpenFileItem alreadyTrackItem;

            // 닫힌 파일에 대한 쓰기 시도 추적
            if (trackOpenFileDictionary.TryGetValue(fileOperateLog.FilePath, out alreadyTrackItem) == false)
            {
                closedButTryingWriteReport.AppendText("- " + fileOperateLog.ToKeyString() + "\r\n");
                closedButTryingWriteCount++;
            }
        }
Пример #5
0
        private void ProcessCloseFileLog(Dictionary <String, TrackOpenFileItem> trackOpenFileDictionary, FileOperateLog fileOperateLog)
        {
            TrackOpenFileItem alreadyTrackItem;

            if (trackOpenFileDictionary.TryGetValue(fileOperateLog.FilePath, out alreadyTrackItem) == true)
            {
                alreadyTrackItem.OpenCount--;
                if (alreadyTrackItem.OpenCount <= 0)
                {
                    trackOpenFileDictionary.Remove(fileOperateLog.FilePath);
                }
            }
            else
            {
                outputView.AppendText("- 열리지 않은 파일이 닫힘" + fileOperateLog.ToKeyString() + "\r\n");
            }
        }
Пример #6
0
        private void ProcessOpenFileLog(Dictionary <String, TrackOpenFileItem> trackOpenFileDictionary, FileOperateLog fileOperateLog)
        {
            TrackOpenFileItem alreadyTrackItem;

            if (trackOpenFileDictionary.TryGetValue(fileOperateLog.FilePath, out alreadyTrackItem) == true)
            {
                alreadyTrackItem.OpenCount++;
            }
            else
            {
                TrackOpenFileItem newTrackItem = new TrackOpenFileItem(fileOperateLog);

                trackOpenFileDictionary.Add(newTrackItem.FilePath, newTrackItem);

                // 열린 파일 최대로 많은 경우 추적
                if (trackOpenFileDictionary.Count > trackMaxOpenedFileCount)
                {
                    trackMaxOpenedFileCount = trackOpenFileDictionary.Count;

                    // 열린 파일이 500개 이상이면 레포팅
                    if (trackMaxOpenedFileCount > 500)
                    {
                        outputView.AppendText("- 500개 이상의 파일을 동시에 엽니다 \r\n");
                    }
                }
            }
        }