private void AddSearchResult(GrepSearchResult result) { lock (lockObj) { searchResults.Add(result); } }
public static FileData GetFileData(GrepSearchResult searchResult) { if (searchResult == null) { throw new ArgumentNullException(nameof(searchResult)); } string[] parts = searchResult.FileNameDisplayed.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); if (!searchResult.FileNameDisplayed.Contains(ArchiveSeparator) || parts.Length < 2) { return(null); } string innerFileName = parts.Last(); string[] intermediateFiles = parts.Skip(1).Take(parts.Length - 2).ToArray(); string zipFile = searchResult.FileNameReal; if (zipFile.Length > 260 && !zipFile.StartsWith(@"\\?\", StringComparison.InvariantCulture)) { zipFile = @"\\?\" + zipFile; } using (FileStream input = File.Open(zipFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { return(GetFileData(input, searchResult.FileNameReal, innerFileName, intermediateFiles)); } }
public OpenFileArgs(GrepSearchResult searchResult, string pattern, int line, bool useCustomEditor, string customEditor, string customEditorArgs) : base() { SearchResult = searchResult; LineNumber = line; UseCustomEditor = useCustomEditor; CustomEditor = customEditor; CustomEditorArgs = customEditorArgs; UseBaseEngine = false; Pattern = pattern; }
public static string ExtractToTempFile(GrepSearchResult searchResult) { if (searchResult == null) { throw new ArgumentNullException(nameof(searchResult)); } string tempFolder = Path.Combine(Utils.GetTempFolder(), "dnGREP-Archive", Utils.GetHash(searchResult.FileNameReal)); string[] parts = searchResult.FileNameDisplayed.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); if (!searchResult.FileNameDisplayed.Contains(ArchiveSeparator) || parts.Length < 2) { return(string.Empty); } string innerFileName = parts.Last(); string[] intermediateFiles = parts.Skip(1).Take(parts.Length - 2).ToArray(); string filePath = Path.Combine(tempFolder, innerFileName); if (!File.Exists(filePath)) { // use the directory name to also include folders within the archive string directory = Path.GetDirectoryName(filePath); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } string zipFile = searchResult.FileNameReal; if (zipFile.Length > 260 && !zipFile.StartsWith(@"\\?\", StringComparison.InvariantCulture)) { zipFile = @"\\?\" + zipFile; } using (FileStream input = File.Open(zipFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { ExtractToTempFile(input, filePath, searchResult.FileNameReal, innerFileName, intermediateFiles); } } return(filePath); }
public static void OpenFile(OpenFileArgs args) { if (args == null) { throw new ArgumentNullException(nameof(args)); } string filePath = ExtractToTempFile(args.SearchResult); if (Utils.IsPdfFile(filePath) || Utils.IsWordFile(filePath) || Utils.IsExcelFile(filePath)) { args.UseCustomEditor = false; } GrepSearchResult newResult = new GrepSearchResult { FileNameReal = args.SearchResult.FileNameReal, FileNameDisplayed = args.SearchResult.FileNameDisplayed }; OpenFileArgs newArgs = new OpenFileArgs(newResult, args.Pattern, args.LineNumber, args.FirstMatch, args.ColumnNumber, args.UseCustomEditor, args.CustomEditor, args.CustomEditorArgs); newArgs.SearchResult.FileNameDisplayed = filePath; Utils.OpenFile(newArgs); }
private static List <GrepLine> GetLinesWithContext(Stream input, GrepSearchResult searchResult, int linesBefore, int linesAfter, string innerFileName, string[] intermediateFiles) { List <GrepLine> results = new List <GrepLine>(); using (SevenZipExtractor extractor = new SevenZipExtractor(input, true)) { if (intermediateFiles.Length > 0) { int index = -1; if (extractor.ArchiveFileData.Count == 1) { index = 0; } else { string name = intermediateFiles.First(); var fd = extractor.ArchiveFileData.FirstOrDefault(f => string.Equals(f.FileName, name)); if (fd != null) { index = fd.Index; } } if (index > -1) { using (Stream stream = new MemoryStream(4096)) { extractor.ExtractFile(index, stream); string[] newIntermediateFiles = intermediateFiles.Skip(1).ToArray(); results = GetLinesWithContext(stream, searchResult, linesBefore, linesAfter, innerFileName, newIntermediateFiles); } } } else { int index = -1; if (extractor.ArchiveFileData.Count == 1) { index = 0; } else { var fd = extractor.ArchiveFileData.FirstOrDefault(f => string.Equals(f.FileName, innerFileName)); if (fd != null) { index = fd.Index; } } if (index > -1) { using (Stream stream = new MemoryStream(4096)) { try { extractor.ExtractFile(index, stream); stream.Seek(0, SeekOrigin.Begin); using (StreamReader reader = new StreamReader(stream)) { results = Utils.GetLinesEx(reader, searchResult.Matches, linesBefore, linesAfter); } } catch (Exception ex) { logger.Error(ex, string.Format(CultureInfo.CurrentCulture, "Failed extract file {0} from archive '{1}'", innerFileName, searchResult.FileNameReal)); } } } } } return(results); }