У меня есть 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
Исправлен код благодаря @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;
Здесь вы открываете неверный файл:
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; }
}
}
}
...