完成后,如何更改此代码以关闭文件?

时间:2019-07-06 21:03:48

标签: c#

我在一段我不记得的地方找到了这段代码,并且可以从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());

1 个答案:

答案 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();
}

好的,应该这样做。

如果,您放弃了所有错误检查,例如

  • 如果在存档中找不到文件怎么办?
  • 如果文件不是文本文件怎么办?
  • 文件的编码是什么? UTF8? Windows-1252? UTF16?