.NET 3.5 DotNetZip Проблемы с поиском в извлеченных файлах

1

У меня есть zip файлы, которые мне нужны для поиска. У меня есть рабочий код для.NET 4.5 с использованием System.IO.Compression, и он работает безупречно, но я не могу заставить его работать, используя DotNetZip в.NET 3.5

Вот мой код

di = new DirectoryInfo(sFullLogPath + "\\");
                files = di.GetFiles(sExtension);
                logs.Info("Searching " + sType + " logs on  " + sDate + " for " + sSearchTerm);
                Console.WriteLine("");
                try
                {
                    foreach(var file in files)
                    {
                        //Console.WriteLine(file.FullName);
                        using (ZipFile archive = ZipFile.Read(sFullLogPath + "\\" + file.Name))
                        {
                            foreach(var entry in archive)
                            {
                                if(entry.FileName.EndsWith(".ininlog",StringComparison.OrdinalIgnoreCase))
                                {
                                    //Console.WriteLine(entry.FileName);
                                    try
                                    {
                                        Directory.CreateDirectory(sTemp);
                                        entry.Extract(Path.Combine(sTemp, entry.FileName));
                                        Stream streamTemp = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                                        StreamReader streamReader = new StreamReader(streamTemp);
                                        string line;
                                        while ((line = streamReader.ReadLine()) != null)
                                        {
                                            if (line.Contains(sSearchTerm))
                                            { logs.Info("{0} contains \"{1}\"", file.Name, sSearchTerm); break; }
                                            else
                                            { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("{0} does not contain \"{1}\"", file.Name, sSearchTerm); Console.ResetColor(); break; }
                                        }
                                    }
                                    catch (UnauthorizedAccessException ae)
                                    {
                                        logs.Error(ae.Message);
                                    }
                                    catch (SystemException se)
                                    {
                                        logs.Error(se.Message);
                                    }
                                    catch (ApplicationException ape)
                                    {
                                        logs.Error(ape.Message);
                                    }
                                    catch (Exception e)
                                    {
                                        logs.Error(e.Message);
                                    }
                                    finally
                                    {
                                        Directory.Delete(sTemp, true);
                                        archive.Dispose();
                                    }
                                }
                            }
                        }
                    }
                }
                catch (UnauthorizedAccessException ae)
                {
                    logs.Error(ae.Message);
                }
                catch (SystemException se)
                {
                    logs.Error(se.Message);
                }
                catch (ApplicationException ape)
                {
                    logs.Error(ape.Message);
                }
                catch (Exception e)
                {
                    logs.Error(e.Message);
                }

Ожидаемое поведение:

Каждый заархивированный файл в каталоге распаковывается во временное место, а затем выполняется поиск, чтобы увидеть, находится ли строка в этом файле, если он будет найден, будет выведено имя файла, который был найден в

Текущее поведение:

Не находить и ссылаться на строку, которую я ищу, даже если я ее знаю, и она отлично работает с версией.NET 4.5 в том же файле

Почему я не использую.NET 4.5, у нас есть пользовательское программное обеспечение на наших серверах, и в настоящее время у него есть проблемы с.NET 4.5 Изображение 174551Изображение 174551

Исправлен код благодаря @Thomas - похоже, что другое вызывало ложное срабатывание

else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("{0} does not contain \"{1}\"", file.Name, sSearchTerm); Console.ResetColor(); break; } 

Вот фиксированный код

di = new DirectoryInfo(sFullLogPath + "\\");
                files = di.GetFiles(sExtension);
                logs.Info("Searching " + sType + " logs on  " + sDate + " for " + sSearchTerm);
                Console.WriteLine("");
                try
                {
                    foreach(var file in files)
                    {
                        //Console.WriteLine(file.Name);
                        using (ZipFile archive = ZipFile.Read(file.FullName))
                        {
                            foreach(var entry in archive)
                            {
                                if(entry.FileName.EndsWith(".ininlog", StringComparison.OrdinalIgnoreCase))
                                {
                                    try
                                    {
                                        using (var tempStream = entry.OpenReader())
                                        using (var streamReader = new StreamReader(tempStream))
                                        {
                                            string line;
                                            while ((line = streamReader.ReadLine()) != null)
                                            {
                                                if(line.Contains(sSearchTerm))
                                                {
                                                    logs.Info("{0} contains \"{1}\"", file.Name, sSearchTerm);
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    catch (UnauthorizedAccessException ae)
                                    {
                                        logs.Error(ae.Message);
                                    }
                                    catch (SystemException se)
                                    {
                                        logs.Error(se.Message);
                                    }
                                    catch (ApplicationException ape)
                                    {
                                        logs.Error(ape.Message);
                                    }
                                    catch (Exception e)
                                    {
                                        logs.Error(e.Message);
                                    }
                                    finally
                                    {
                                        archive.Dispose();
                                        //Directory.Delete(sTemp + "\\" + entry.FileName);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (UnauthorizedAccessException ae)
                {
                    logs.Error(ae.Message);
                }
                catch (SystemException se)
                {
                    logs.Error(se.Message);
                }
                catch (ApplicationException ape)
                {
                    logs.Error(ape.Message);
                }
                catch (Exception e)
                {
                    logs.Error(e.Message);
                }
                finally
                {
                    //
                }
                break;
  • 0
    Вы должны отладить свой код и выяснить, связана ли проблема с компрессией / декомпрессией или поиском. Также похоже, что ответ Томаса Левеска показывает проблему (когда вы пытаетесь найти ZIP как текстовый файл для строки).
Теги:
dotnetzip

1 ответ

4
Лучший ответ

Здесь вы открываете неверный файл:

Stream streamTemp = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

file - это ZIP файл, а не только тот файл, который вы только что извлекли.

Кстати, я не думаю, что вам нужно извлечь файлы, DotNetZip, вероятно, позволяет вам напрямую писать несжатый поток.


EDIT: я только что проверил: вы можете использовать метод OpenReader чтобы получить поток для чтения несжатого содержимого записи. Просто создайте StreamReader вокруг этого потока; нет необходимости извлекать файл.

...
try
{
    using (var stream = entry.OpenReader())
    using (var reader = new StreamReader(stream))
    {
        string line;
        while ((line = streamReader.ReadLine()) != null)
        {
            if (line.Contains(sSearchTerm))
            { logs.Info("{0} contains \"{1}\"", file.Name, sSearchTerm); break; }
            else
            { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("{0} does not contain \"{1}\"", file.Name, sSearchTerm); Console.ResetColor(); break; }
        }
    }
}
...
  • 0
    Я не хочу запускать это в потоке, так как серверы, на которых находятся журналы, находятся в рабочем состоянии, и я пытаюсь ограничить используемую память / ресурсы, большинство журналов по 2 ГБ каждый, поэтому я извлекал в временное местоположение
  • 1
    @ondrovic, чтение потока непосредственно из zip не загружает весь файл в память; данные распаковываются по требованию при чтении потока и не сохраняются в памяти (кроме той части, которая находится в буфере StreamReader, но обычно она довольно мала)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню