Как извлечь Zip внутри Zip со всем уникальным идентификатором файла? - PullRequest
0 голосов
/ 12 октября 2018

Я использую приложение Windows.Моя проблема в том, что я хочу отобразить «Парентид файлов» и его уникальный идентификатор в списке с именем файлов.Я попробовал ниже код.Он отлично работает с ParentId, но когда дело доходит до pkUniqueId, он также принимает родительский идентификатор из-за строки с комментариями ниже.Он вызывает тот же метод и заменяет 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

Над структурой, правильно генерирующей Parent 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 голосов
/ 12 октября 2018

Srusti,

Я полагаю, что из-за того, что ваш метод реализован как рекурсивный метод, гарантируется, что элементы с одинаковым уровнем глубины рекурсии не получат одинаковые pkUniqueId значений, но элементы с более глубоким уровнем рекурсии могут получать дубликаты pkUniqueId значений.

Это происходит потому, что методы, находящиеся глубже в рекурсивных вызовах, увеличивают значения pkUniqueId, но когда онизавершите их выполнение, увеличенные значения pkUniqueId будут потеряны, и методы на более мелких уровнях рекурсии никогда не будут теперь, когда pkUniqueId увеличился.Пожалуйста, попробуйте использовать отладчик для пошагового выполнения вашего приложения и проверьте, как генерация идентификатора приводит к потере в вашем конкретном случае.

Я бы посоветовал вам попробовать реализовать этот метод с использованием нерекурсивного подхода,Еще один способ решить эту проблему - передать параметр pkUniqueId вашего метода для каждой ссылки, чтобы гарантировать, что его изменения в более глубоких уровнях рекурсии будут отражены в более мелких уровнях рекурсии.

...