如何使用所有唯一文件ID提取Zip中的Zip?

时间:2018-10-12 12:52:17

标签: c# winforms zipfile

我正在使用Windows应用程序。我的问题是我想显示“文件父母”,并且它是“文件名”列表中的唯一ID。我试过下面的代码。它可以与ParentId一起正常工作,但是涉及到pkUniqueId时,由于下面的注释行,它也需要父ID。它在调用相同的方法,并用以前的值替换pkUniqueId。我的Zip文件结构是

1)Test.Zip

  1.1) Test1.Zip
      1.1.1) SampleDoc1.doc
      1.1.2) SampleDoc2.doc
  1.2) SampleText1.txt
  1.3) SampleText2.txt

上面的结构会正确地为其子代生成父ID。但是会复制最后两个文档的UniqueId。

如果我的文件结构为

1)Test.Zip

  1.1) SampleText1.txt
  1.2) SampleText2.txt
  1.3) Test1.zip
      1.3.1) SampleDoc1.doc
      1.3.2) SampleDoc2.doc

然后按预期工作。

public static List<ZipExtracFile> ZipFile(string filePath, string initialDirectory, int pkUniqueId)
{
    int extractFileParentId = pkUniqueId;


    List<ZipExtracFile> extractFileList = new List<ZipExtracFile>();

    using (ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(filePath))
    {
        foreach (ZipArchiveEntry entry in archive.Entries)
        {
            pkUniqueId = pkUniqueId + 1;
            extractFileList.Add(new ZipExtracFile { pkUniqueId = pkUniqueId, fileName = entry.Name, parentId = extractFileParentId });

            if (Path.GetExtension(entry.FullName).ToLower() == ".zip")
            {
                string fullPath = Path.Combine(initialDirectory, entry.FullName);

                extractFileList.AddRange(ZipFile(fullPath, initialDirectory, pkUniqueId)); // Due to this Line
            }

        }
    }
    return extractFileList;
}

有什么建议吗?我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

Srusti,

我相信,由于您的方法是作为递归方法实现的,因此可以保证递归深度相同的项不会收到相同的pkUniqueId值,但是在更深层次的递归级别中,可以接收重复 pkUniqueId个值。

之所以发生这种情况,是因为递归调用中更深的方法将增加pkUniqueId的值,但是当它们完成执行时,增加的pkUniqueId值将丢失,并且较浅的递归级别的方法将永远不会现在pkUniqueId已增加。请尝试使用调试器逐步执行应用程序,并验证在特定情况下ID生成是如何造成丢失的。

我建议您尝试使用非递归方法来实现该方法。解决此问题的另一种方法是传递每个引用的方法的pkUniqueId参数,以确保其在较深递归级别中的更改将反映在较浅递归级别中。