我在一段我不记得的地方找到了这段代码,并且可以从zip文件(infile
)解压缩文件(inzip
)来正常工作。请注意,实际上,inzip
仅包含一个文件。
完成后它不会关闭文件。
有人(1)可以解密正在做什么,并且(2)更重要的是,可以给我一些想法,以便在完成后关闭zip文件(inzip
)或提供一种更具可读性的方式来完成此操作。
dataout = new string(
(new System.IO.StreamReader(
System.IO.Compression.ZipFile.OpenRead(inzip)
.Entries.Where(x => x.Name.Equals(infile, StringComparison.InvariantCulture))
.FirstOrDefault()
.Open())
.ReadToEnd())
.ToArray());
答案 0 :(得分:0)
让我们尝试一次解决这一步骤。正如我在评论中所写的那样,这段代码太糟糕了,很难跳过问题中的代码到最终答案,因为这将跳过几个步骤。
这是原始代码,其中包含所有原始问题:
dataout = new string(
(new System.IO.StreamReader(
System.IO.Compression.ZipFile.OpenRead(inzip)
.Entries.Where(x => x.Name.Equals(infile, StringComparison.InvariantCulture))
.FirstOrDefault()
.Open())
.ReadToEnd())
.ToArray());
我们必须从最里面的对象开始,它是zip文件,所以我们首先关闭它,我们可以使用Dispose
来完成,或者重写代码以使用using
:< / p>
using (var zipfile = System.IO.Compression.ZipFile.OpenRead(inzip))
{
dataout = new string(
(new System.IO.StreamReader(
zipfile
.Entries.Where(x => x.Name.Equals(infile, StringComparison.InvariantCulture))
.FirstOrDefault()
.Open())
.ReadToEnd())
.ToArray());
}
但是,这不可能解决所有问题。 StreamReader
对象实际上应该在关闭zip文件之前关闭,所以让我们处理一下:
using (var zipfile = System.IO.Compression.ZipFile.OpenRead(inzip))
using (var reader = new System.IO.StreamReader(zipfile.Entries.Where(x => x.Name.Equals(infile, StringComparison.InvariantCulture)).FirstOrDefault().Open()))
{
dataout = new string(reader.ReadToEnd().ToArray());
}
但是,reader.ReadToEnd().ToArray()
又如何呢?它将读取一个字符串,并将其转换为数组,然后将其用作构造字符串的参数。
怎么样:
using (var zipfile = System.IO.Compression.ZipFile.OpenRead(inzip))
using (var reader = new System.IO.StreamReader(zipfile.Entries.Where(x => x.Name.Equals(infile, StringComparison.InvariantCulture)).FirstOrDefault().Open()))
{
dataout = reader.ReadToEnd();
}
好的,应该这样做。
如果,您放弃了所有错误检查,例如