我有需要搜索的zip文件,我具有使用System.IO.Compression的.NET 4.5的工作代码,它可以完美工作,但在.NET 3.5中使用DotNetZip似乎无法使其正常工作
这是我的代码
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导致了误报
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可能允许您直接编写未压缩的流。
编辑:我刚刚检查:您可以使用
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; }
}
}
}
...