Example #1
0
 private void AddSearchResult(GrepSearchResult result)
 {
     lock (lockObj)
     {
         searchResults.Add(result);
     }
 }
Example #2
0
        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));
            }
        }
Example #3
0
 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;
 }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }