public List <GrepSearchResult> Search(string file, string searchPattern, SearchType searchType, GrepSearchOption searchOptions, Encoding encoding) { string tempFolder = Path.Combine(Utils.GetTempFolder(), "dnGREP-PDF"); try { // Extract text string tempFile = ExtractText(file); if (!File.Exists(tempFile)) { throw new ApplicationException("pdftotext failed to create text file."); } // GrepCore cannot check encoding of the original pdf file. If the encoding parameter is not default // then it is the user-specified code page. If the encoding parameter *is* the default, // then it most likely not been set, so get the encoding of the extracted text file: if (encoding == Encoding.Default) { encoding = Utils.GetFileEncoding(tempFile); } IGrepEngine engine = GrepEngineFactory.GetSearchEngine(tempFile, initParams, FileFilter); List <GrepSearchResult> results = engine.Search(tempFile, searchPattern, searchType, searchOptions, encoding); if (results.Count > 0) { using (FileStream reader = File.Open(tempFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (StreamReader streamReader = new StreamReader(reader, encoding)) { foreach (var result in results) { result.SearchResults = Utils.GetLinesEx(streamReader, result.Matches, initParams.LinesBefore, initParams.LinesAfter); } } foreach (GrepSearchResult result in results) { result.ReadOnly = true; if (file.Contains(tempFolder)) { result.FileNameDisplayed = file.Substring(tempFolder.Length + 1); } else { result.FileNameDisplayed = file; } result.FileNameReal = file; } } GrepEngineFactory.ReturnToPool(tempFile, engine); return(results); } catch (Exception ex) { logger.Error(ex, $"Failed to search inside PDF file: {ex.Message}"); return(new List <GrepSearchResult>()); } }
public List <GrepSearchResult> Search(string file, string searchPattern, SearchType searchType, GrepSearchOption searchOptions, Encoding encoding) { string tempFolder = Path.Combine(Utils.GetTempFolder(), "dnGREP-PDF"); try { // Extract text string tempFile = extractText(file); if (!File.Exists(tempFile)) { throw new ApplicationException("pdftotext failed to create text file."); } IGrepEngine engine = GrepEngineFactory.GetSearchEngine(tempFile, initParams, FileFilter); List <GrepSearchResult> results = engine.Search(tempFile, searchPattern, searchType, searchOptions, encoding); if (results.Count > 0) { using (FileStream reader = File.Open(tempFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (StreamReader streamReader = new StreamReader(reader)) { foreach (var result in results) { result.SearchResults = Utils.GetLinesEx(streamReader, result.Matches, initParams.LinesBefore, initParams.LinesAfter); } } foreach (GrepSearchResult result in results) { result.ReadOnly = true; if (file.Contains(tempFolder)) { result.FileNameDisplayed = file.Substring(tempFolder.Length + 1); } else { result.FileNameDisplayed = file; } result.FileNameReal = file; } } GrepEngineFactory.ReturnToPool(tempFile, engine); return(results); } catch (Exception ex) { logger.Log <Exception>(LogLevel.Error, "Failed to search inside Pdf file", ex); return(new List <GrepSearchResult>()); } }
public int Replace(Dictionary <string, string> files, SearchType searchType, string searchPattern, string replacePattern, GrepSearchOption searchOptions, int codePage) { string tempFolder = Utils.GetTempFolder(); if (files == null || files.Count == 0 || !Directory.Exists(tempFolder)) { return(0); } replacePattern = Utils.ReplaceSpecialCharacters(replacePattern); int processedFiles = 0; Utils.CancelSearch = false; string tempFileName = null; try { foreach (string file in files.Keys) { ProcessedFile(this, new ProgressStatus(true, processedFiles, processedFiles, null, file)); // the value in the files dictionary is the temp file name assigned by // the caller for any possible Undo operation tempFileName = Path.Combine(tempFolder, files[file]); IGrepEngine engine = GrepEngineFactory.GetReplaceEngine(file, SearchParams, FileFilter); try { processedFiles++; // Copy file Utils.CopyFile(file, tempFileName, true); Utils.DeleteFile(file); Encoding encoding = Encoding.Default; if (codePage > -1) { encoding = Encoding.GetEncoding(codePage); } else if (!Utils.IsBinary(tempFileName)) { encoding = Utils.GetFileEncoding(tempFileName); } if (Utils.CancelSearch) { break; } if (!engine.Replace(tempFileName, file, searchPattern, replacePattern, searchType, searchOptions, encoding)) { throw new ApplicationException("Replace failed for file: " + file); } if (!Utils.CancelSearch) { ProcessedFile(this, new ProgressStatus(false, processedFiles, processedFiles, null, file)); } File.SetAttributes(file, File.GetAttributes(tempFileName)); GrepEngineFactory.ReturnToPool(file, engine); if (Utils.CancelSearch) { // Replace the file Utils.DeleteFile(file); Utils.CopyFile(tempFileName, file, true); break; } } catch (Exception ex) { logger.Log <Exception>(LogLevel.Error, ex.Message, ex); try { // Replace the file if (File.Exists(tempFileName) && File.Exists(file)) { Utils.DeleteFile(file); Utils.CopyFile(tempFileName, file, true); } } catch { // DO NOTHING } return(-1); } } } finally { GrepEngineFactory.UnloadEngines(); } return(processedFiles); }
private void Search(string file, SearchType searchType, string searchPattern, GrepSearchOption searchOptions, int codePage) { try { ProcessedFile(this, new ProgressStatus(true, processedFilesCount, foundfilesCount, null, file)); IGrepEngine engine = GrepEngineFactory.GetSearchEngine(file, SearchParams, FileFilter); Interlocked.Increment(ref processedFilesCount); Encoding encoding = Encoding.Default; if (codePage > -1) { encoding = Encoding.GetEncoding(codePage); } else if (!Utils.IsBinary(file) && !Utils.IsPdfFile(file)) { encoding = Utils.GetFileEncoding(file); } if (Utils.CancelSearch) { if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } return; } List <GrepSearchResult> fileSearchResults = engine.Search(file, searchPattern, searchType, searchOptions, encoding); if (fileSearchResults != null && fileSearchResults.Count > 0) { AddSearchResults(fileSearchResults); } int hits = fileSearchResults.Where(r => r.IsSuccess).Count(); Interlocked.Add(ref foundfilesCount, hits); ProcessedFile(this, new ProgressStatus(false, processedFilesCount, foundfilesCount, fileSearchResults, file)); GrepEngineFactory.ReturnToPool(file, engine); } catch (Exception ex) { logger.Log <Exception>(LogLevel.Error, ex.Message, ex); AddSearchResult(new GrepSearchResult(file, searchPattern, ex.Message, false)); if (ProcessedFile != null) { List <GrepSearchResult> _results = new List <GrepSearchResult>(); _results.Add(new GrepSearchResult(file, searchPattern, ex.Message, false)); ProcessedFile(this, new ProgressStatus(false, processedFilesCount, foundfilesCount, _results, file)); } } finally { if ((searchOptions & GrepSearchOption.StopAfterFirstMatch) == GrepSearchOption.StopAfterFirstMatch && searchResults.Count > 0) { if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } } } }
public int Replace(IEnumerable <ReplaceDef> files, SearchType searchType, string searchPattern, string replacePattern, GrepSearchOption searchOptions, int codePage) { string tempFolder = Utils.GetTempFolder(); if (files == null || !files.Any() || !Directory.Exists(tempFolder)) { return(0); } GrepEngineBase.ResetGuidxCache(); replacePattern = Utils.ReplaceSpecialCharacters(replacePattern); int processedFiles = 0; Utils.CancelSearch = false; string tempFileName = null; try { foreach (var item in files) { ProcessedFile(this, new ProgressStatus(true, processedFiles, processedFiles, null, item.OrginalFile)); // the value in the files dictionary is the temp file name assigned by // the caller for any possible Undo operation tempFileName = Path.Combine(tempFolder, item.BackupName); IGrepEngine engine = GrepEngineFactory.GetReplaceEngine(item.OrginalFile, SearchParams, FileFilter); try { processedFiles++; // Copy file Utils.CopyFile(item.OrginalFile, tempFileName, true); Utils.DeleteFile(item.OrginalFile); Encoding encoding = Encoding.Default; if (codePage > -1) { encoding = Encoding.GetEncoding(codePage); } else if (!Utils.IsBinary(tempFileName)) { encoding = Utils.GetFileEncoding(tempFileName); } // The UTF-8 encoding returned from Encoding.GetEncoding("utf-8") includes the BOM - see Encoding.GetPreamble() // If this file does not have the BOM, then change to an encoder without the BOM so the BOM is not added in // the replace operation if (encoding is UTF8Encoding && !Utils.HasUtf8ByteOrderMark(tempFileName)) { encoding = new UTF8Encoding(false); } if (Utils.CancelSearch) { break; } if (!engine.Replace(tempFileName, item.OrginalFile, searchPattern, replacePattern, searchType, searchOptions, encoding, item.ReplaceItems)) { throw new ApplicationException("Replace failed for file: " + item.OrginalFile); } if (!Utils.CancelSearch) { ProcessedFile(this, new ProgressStatus(false, processedFiles, processedFiles, null, item.OrginalFile)); } File.SetAttributes(item.OrginalFile, File.GetAttributes(tempFileName)); GrepEngineFactory.ReturnToPool(item.OrginalFile, engine); if (Utils.CancelSearch) { // Replace the file Utils.DeleteFile(item.OrginalFile); Utils.CopyFile(tempFileName, item.OrginalFile, true); break; } } catch (Exception ex) { logger.Log <Exception>(LogLevel.Error, ex.Message, ex); try { // Replace the file if (File.Exists(tempFileName) && File.Exists(item.OrginalFile)) { Utils.DeleteFile(item.OrginalFile); Utils.CopyFile(tempFileName, item.OrginalFile, true); } } catch { // DO NOTHING } return(-1); } } } finally { GrepEngineFactory.UnloadEngines(); } return(processedFiles); }
public List <GrepSearchResult> Search(Stream input, string file, string searchPattern, SearchType searchType, GrepSearchOption searchOptions, Encoding encoding) { List <GrepSearchResult> searchResults = new List <GrepSearchResult>(); var filter = FileFilter.ToStandardFilter(); var includeRegexPatterns = new List <Regex>(); var excludeRegexPatterns = new List <Regex>(); Utils.PrepareFilters(filter, includeRegexPatterns, excludeRegexPatterns); List <string> hiddenDirectories = new List <string>(); try { using (SevenZipExtractor extractor = new SevenZipExtractor(input)) { foreach (var fileInfo in extractor.ArchiveFileData) { var attr = (FileAttributes)fileInfo.Attributes; string innerFileName = fileInfo.FileName; if (fileInfo.IsDirectory) { if (!filter.IncludeHidden && attr.HasFlag(FileAttributes.Hidden) && !hiddenDirectories.Contains(innerFileName)) { hiddenDirectories.Add(innerFileName); } continue; } if (CheckHidden(filter, attr) && CheckHidden(filter, innerFileName, hiddenDirectories) && CheckSize(filter, fileInfo.Size) && CheckDate(filter, fileInfo) && IsPatternMatch(innerFileName, includeRegexPatterns) && !IsPatternMatch(innerFileName, excludeRegexPatterns)) { using (Stream stream = new MemoryStream()) { extractor.ExtractFile(innerFileName, stream); stream.Seek(0, SeekOrigin.Begin); if (CheckBinary(filter, stream)) { // Need to check the encoding of each file in the archive. If the encoding parameter is not default // then it is the user-specified code page. If the encoding parameter *is* the default, // then it most likely not been set, so get the encoding of the extracted text file: if (encoding == Encoding.Default && !Utils.IsBinary(stream)) { stream.Seek(0, SeekOrigin.Begin); encoding = Utils.GetFileEncoding(stream); } IGrepEngine engine = GrepEngineFactory.GetSearchEngine(innerFileName, initParams, filter); var innerFileResults = engine.Search(stream, innerFileName, searchPattern, searchType, searchOptions, encoding); if (innerFileResults.Count > 0) { using (Stream readStream = new MemoryStream()) { extractor.ExtractFile(innerFileName, readStream); readStream.Seek(0, SeekOrigin.Begin); using (StreamReader streamReader = new StreamReader(readStream, encoding)) { foreach (var result in innerFileResults) { if (Utils.CancelSearch) { break; } if (!result.HasSearchResults) { result.SearchResults = Utils.GetLinesEx(streamReader, result.Matches, initParams.LinesBefore, initParams.LinesAfter); } } } searchResults.AddRange(innerFileResults); } } GrepEngineFactory.ReturnToPool(innerFileName, engine); } if (Utils.CancelSearch) { break; } } } } } foreach (GrepSearchResult result in searchResults) { result.FileNameDisplayed = file + "\\" + result.FileNameDisplayed; result.FileNameReal = file; result.ReadOnly = true; } } catch (Exception ex) { logger.Log <Exception>(LogLevel.Error, string.Format("Failed to search inside archive '{0}'", file), ex); } return(searchResults); }
private void Search(string file, SearchType searchType, string searchPattern, GrepSearchOption searchOptions, int codePage) { try { ProcessedFile(this, new ProgressStatus(true, processedFilesCount, foundfilesCount, null, file)); bool isArchive = Utils.IsArchive(file); Encoding encoding = Encoding.Default; if (codePage > -1) { encoding = Encoding.GetEncoding(codePage); } else if (!isArchive && !Utils.IsBinary(file) && !Utils.IsPdfFile(file)) { encoding = Utils.GetFileEncoding(file); } if (Utils.CancelSearch) { if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } return; } IGrepEngine engine = GrepEngineFactory.GetSearchEngine(file, SearchParams, FileFilter, searchType); if (isArchive && engine is ArchiveEngine archiveEngine) { archiveEngine.SetSearchOptions(FileFilter, SearchParams); archiveEngine.StartingFileSearch += ArchiveEngine_StartingFileSearch; foreach (var fileSearchResults in archiveEngine.Search(file, searchPattern, searchType, searchOptions, encoding)) { if (fileSearchResults != null && fileSearchResults.Count > 0) { AddSearchResults(fileSearchResults); } int hits = fileSearchResults.Where(r => r.IsSuccess).Count(); Interlocked.Add(ref foundfilesCount, hits); ProcessedFile(this, new ProgressStatus(false, processedFilesCount, foundfilesCount, fileSearchResults, file)); } archiveEngine.StartingFileSearch -= ArchiveEngine_StartingFileSearch; } else { Interlocked.Increment(ref processedFilesCount); var fileSearchResults = engine.Search(file, searchPattern, searchType, searchOptions, encoding).ToList(); if (fileSearchResults != null && fileSearchResults.Count > 0) { AddSearchResults(fileSearchResults); } int hits = fileSearchResults.Where(r => r.IsSuccess).Count(); Interlocked.Add(ref foundfilesCount, hits); ProcessedFile(this, new ProgressStatus(false, processedFilesCount, foundfilesCount, fileSearchResults, file)); } GrepEngineFactory.ReturnToPool(file, engine); } catch (Exception ex) { logger.Error(ex, "Failed in Search"); AddSearchResult(new GrepSearchResult(file, searchPattern, ex.Message, false)); if (ProcessedFile != null) { List <GrepSearchResult> _results = new List <GrepSearchResult> { new GrepSearchResult(file, searchPattern, ex.Message, false) }; ProcessedFile(this, new ProgressStatus(false, processedFilesCount, foundfilesCount, _results, file)); } } finally { if (searchOptions.HasFlag(GrepSearchOption.StopAfterFirstMatch) && searchResults.Count > 0) { if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } } } }