Пример #1
0
        public FindResult Find()
        {
            Verify.Argument.IsNotEmpty(Dir, "Dir");
            Verify.Argument.IsNotEmpty(FileMask, "FileMask");
            Verify.Argument.IsNotEmpty(FindText, "FindText");

            Status status = Status.Processing;

            StopWatch.Start("GetFilesInDirectory");

            //time
            var startTime = DateTime.Now;


            string[] filesInDirectory = Utils.GetFilesInDirectory(Dir, FileMask, IncludeSubDirectories, ExcludeFileMask, ExcludeDir);

            var resultItems = new List <FindResultItem>();
            var stats       = new Stats();

            stats.Files.Total = filesInDirectory.Length;

            StopWatch.Stop("GetFilesInDirectory");


            var startTimeProcessingFiles = DateTime.Now;

            foreach (string filePath in filesInDirectory)
            {
                stats.Files.Processed++;


                var resultItem = FindInFile(filePath);

                if (resultItem.IsSuccess)
                {
                    stats.Matches.Found += resultItem.Matches.Count;

                    if (resultItem.Matches.Count > 0)
                    {
                        stats.Files.WithMatches++;
                    }
                    else
                    {
                        stats.Files.WithoutMatches++;
                    }
                }
                else
                {
                    if (resultItem.FailedToOpen)
                    {
                        stats.Files.FailedToRead++;
                    }

                    if (resultItem.IsBinaryFile)
                    {
                        stats.Files.Binary++;
                    }
                }


                stats.UpdateTime(startTime, startTimeProcessingFiles);


                //Update status
                if (IsCancelRequested)
                {
                    status = Status.Cancelled;
                }

                if (stats.Files.Total == stats.Files.Processed)
                {
                    status = Status.Completed;
                }


                //Skip files that don't have matches
                if (resultItem.IncludeInResultsList)
                {
                    resultItems.Add(resultItem);
                }

                //Handle event
                OnFileProcessed(new FinderEventArgs(resultItem, stats, status, IsSilent));


                if (status == Status.Cancelled)
                {
                    break;
                }
            }



            if (filesInDirectory.Length == 0)
            {
                status = Status.Completed;
                OnFileProcessed(new FinderEventArgs(new FindResultItem(), stats, status, IsSilent));
            }

            return(new FindResult {
                Items = resultItems, Stats = stats
            });
        }
Пример #2
0
        private FindResultItem FindInFile(string filePath)
        {
            var resultItem = new FindResultItem();

            resultItem.IsSuccess = true;
            resultItem.IncludeFilesWithoutMatches = IncludeFilesWithoutMatches;

            resultItem.FileName         = Path.GetFileName(filePath);
            resultItem.FilePath         = filePath;
            resultItem.FileRelativePath = "." + filePath.Substring(Dir.Length);

            byte[] sampleBytes;

            StopWatch.Start("ReadSampleFileContent");

            //Check if can read first
            try
            {
                sampleBytes = Utils.ReadFileContentSample(filePath);
            }
            catch (Exception exception)
            {
                StopWatch.Stop("ReadSampleFileContent");

                resultItem.IsSuccess    = false;
                resultItem.FailedToOpen = true;
                resultItem.ErrorMessage = exception.Message;
                return(resultItem);
            }

            StopWatch.Stop("ReadSampleFileContent");


            if (!SkipBinaryFileDetection)
            {
                StopWatch.Start("IsBinaryFile");

                if (resultItem.IsSuccess)
                {
                    // check for /0/0/0/0
                    if (Utils.IsBinaryFile(sampleBytes))
                    {
                        StopWatch.Stop("IsBinaryFile");

                        resultItem.IsSuccess    = false;
                        resultItem.IsBinaryFile = true;
                        return(resultItem);
                    }
                }

                StopWatch.Stop("IsBinaryFile");
            }

            Encoding encoding = DetectEncoding(sampleBytes);

            if (encoding == null)
            {
                resultItem.IsSuccess    = false;
                resultItem.FailedToOpen = true;
                resultItem.ErrorMessage = "Could not detect file encoding.";
                return(resultItem);
            }

            resultItem.FileEncoding = encoding;

            StopWatch.Start("ReadFullFileContent");

            string fileContent;

            using (var sr = new StreamReader(filePath, encoding))
            {
                fileContent = sr.ReadToEnd();
            }

            StopWatch.Stop("ReadFullFileContent");

            StopWatch.Start("FindMatches");
            RegexOptions regexOptions = Utils.GetRegExOptions(IsCaseSensitive);

            resultItem.Matches = Utils.FindMatches(fileContent, FindText, FindTextHasRegEx, UseEscapeChars, regexOptions);

            StopWatch.Stop("FindMatches");

            resultItem.NumMatches = resultItem.Matches.Count;
            return(resultItem);
        }
Пример #3
0
        private void Run()
        {
            IsCancelled = false;
            _fileCount  = 0;

            StopWatch.Start("FileGetter.Run");

            foreach (var fileMask in FileMasks)
            {
                StopWatch.Start("FileGetter.Run Directory.EnumerateFiles");

                var files = Directory.EnumerateFiles(DirPath, fileMask, SearchOption);

                StopWatch.Stop("FileGetter.Run Directory.EnumerateFiles");

                foreach (string filePath in files)
                {
                    StopWatch.Start("FileGetter.Run IsMatchWithExcludeFileMasks");
                    bool isMatchWithExcludeFileMasks = IsMatchWithExcludeFileMasks(filePath);
                    StopWatch.Stop("FileGetter.Run IsMatchWithExcludeFileMasks");

                    if (!isMatchWithExcludeFileMasks)
                    {
                        _fileCount++;

                        if (UseBlockingCollection)
                        {
                            //StopWatch.Start("FileGetter.FileCollection.Add");
                            FileCollection.Add(filePath);
                            //StopWatch.Stop("FileGetter.FileCollection.Add");
                        }
                        else
                        {
                            StopWatch.Start("FileGetter.Run FileQueue.Enqueue");
                            FileQueue.Enqueue(filePath);
                            StopWatch.Stop("FileGetter.Run FileQueue.Enqueue");
                        }
                    }


                    if (IsCancelRequested)
                    {
                        break;
                    }
                }

                if (IsCancelRequested)
                {
                    break;
                }
            }



            if (IsCancelRequested)
            {
                IsCancelled = true;
            }
            else
            {
                IsFileCountFinal = true;
            }

            if (UseBlockingCollection)
            {
                FileCollection.CompleteAdding();
            }

            StopWatch.Stop("FileGetter.Run");

            StopWatch.PrintCollection(StopWatch.Collection["FileGetter.Run"].Milliseconds);
        }