Извлечение содержимого MPP из ZIP в .NET

Используйте Aspose.ZIP for .NET, чтобы открыть ZIP-архив, проверить его записи и восстановить только MPP-файлы, необходимые C#-приложению. На этой странице извлечение означает поиск элементов с расширением .mpp внутри ZIP-контейнера и запись в контролируемое место назначения. Aspose.ZIP восстанавливает файл из архива, но не интерпретирует и не конвертирует его внутреннее содержимое.

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

Как извлечь MPP-файлы из ZIP с помощью C#

Установите пакет Aspose.ZIP for .NET и подключите пространство имен Aspose.Zip. Метаданные архива доступны до записи, поэтому приложение может проверить ArchiveEntry.Name, ArchiveEntry.IsDirectory и ArchiveEntry.UncompressedSize перед сохранением проектные файлы.


Package Manager Console Command

PM> Install-Package Aspose.Zip

После установки откройте ZIP через Archive, переберите Archive.Entries, выберите записи не-каталоги с расширением .mpp и вызовите ArchiveEntry.Extract для каждого утвержденного назначения. Пример использует только конечное имя файла, поэтому пути из архива не могут записывать вне целевой папки.

Шаги извлечения файлов MPP в C#

  • Определите путь исходного ZIP и создайте изолированный выходной каталог.
  • Откройте пакет классом Archive.
  • Переберите Archive.Entries вместо немедленной распаковки всего пакета.
  • Пропустите каталоги и выберите имена файлов с расширением .mpp.
  • Создайте путь назначения, который остается внутри утвержденного выходного корня.
  • Отклоните записи, превышающие заданный лимит размера после распаковки.
  • Сохраните каждую утвержденную запись через ArchiveEntry.Extract.

Системные требования

  • Поддерживаемая среда выполнения .NET в Windows, Linux или macOS.
  • Visual Studio, JetBrains Rider, Visual Studio Code или другая среда разработки C#.
  • Aspose.ZIP for .NET, установленный через NuGet или подключенный как сборка.
  • Доступ на чтение к исходному ZIP и доступ на запись к каталогу назначения.
  • Четкие лимиты размера, времени выполнения и временного хранилища для недоверенных архивов.

Пример C#: извлечение выбранных файлов MPP из ZIP

Код открывает ZIP-пакет, пропускает каталоги, фильтрует записи по разрешенному расширению и записывает совпадающие файлы в один выходной каталог. Отбрасывание путей из архива не позволяет сегментам родительских каталогов управлять местом назначения. В production-коде также задайте детерминированное правило для дубликатов имен.

Извлечение файлов MPP из ZIP - C#

using Aspose.Zip;
using System;
using System.IO;

string archivePath = Path.GetFullPath("package.zip");
string outputDirectory = Path.GetFullPath("extracted-mpp");
string[] allowedExtensions = { ".mpp" };
const ulong MaxEntrySize = 100UL * 1024 * 1024;

Directory.CreateDirectory(outputDirectory);

using (var archive = new Archive(archivePath))
{
    foreach (ArchiveEntry entry in archive.Entries)
    {
        if (entry.IsDirectory) continue;

        string fileName = Path.GetFileName(entry.Name);
        if (string.IsNullOrWhiteSpace(fileName)) continue;

        string extension = Path.GetExtension(fileName);
        if (!Array.Exists(
            allowedExtensions,
            value => string.Equals(value, extension, StringComparison.OrdinalIgnoreCase)))
        {
            continue;
        }

        if (entry.UncompressedSize > MaxEntrySize)
        {
            throw new InvalidDataException(
                $"Запись '{fileName}' превышает лимит извлечения 100 MB.");
        }

        string destinationPath = Path.Combine(outputDirectory, fileName);
        entry.Extract(destinationPath);
    }
}

Заметки по реализации для файлов MPP

Фильтрация по расширению только определяет файлы-кандидаты; она не доказывает, что содержимое корректно или безопасно. Календари, ресурсы, зависимости задач и данные расписания проверяйте компонентом для управления проектами.

Пример намеренно уплощает пути из архива. Если две утвержденные записи имеют одинаковое конечное имя файла, ArchiveEntry.Extract может перезаписать существующий файл. Определите политику до извлечения: отклонять дубликаты, создавать уникальные имена или сохранять проверенную относительную структуру папок.

Безопасность и конфиденциальность

Загруженный ZIP, имена записей и содержимое рассматривайте как недоверенный ввод. Не объединяйте ArchiveEntry.Name напрямую с выходным каталогом: запись может содержать абсолютный путь или сегменты перехода к родительским каталогам. Пример использует Path.GetFileName; если нужно сохранить папки, разрешите итоговый путь и убедитесь, что он остается внутри утвержденного корня.

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

FAQ по извлечению файлов MPP

Как извлечь только файлы MPP из ZIP-архива в C#?

Откройте ZIP классом Archive, переберите Archive.Entries, отфильтруйте записи не-каталоги по расширению .mpp и вызовите Extract для каждого проверенного выходного пути.

Проверяет ли Aspose.ZIP внутреннее содержимое файла MPP?

Нет. Aspose.ZIP восстанавливает файл, сохраненный в архиве. Чтение, проверка или конвертация содержимого относятся к компоненту, который поддерживает этот формат.

Можно ли использовать тот же шаблон выбора для 7Z, RAR или TAR?

Идея та же, но каждый контейнер нужно открывать соответствующим архивным классом Aspose.ZIP. Типы записей и операции извлечения могут различаться.

Как обрабатывать повторяющиеся имена файлов MPP?

Определите правило до извлечения: отклонять дубликаты, создавать уникальные имена или сохранять проверенную относительную структуру папок.