Extraire des fichiers FileGDB depuis un ZIP dans .NET

Utilisez Aspose.ZIP for .NET pour restaurer un jeu de données FileGDB complet depuis une archive ZIP. Une géodatabase fichier Esri est un répertoire composé de plusieurs fichiers liés, pas un fichier autonome. Il faut donc repérer le dossier dont le nom se termine par .gdb, recréer son arborescence relative après validation et écrire tous les membres nécessaires au dataset.

L’extraction sélective convient aux imports SIG, aux services cartographiques, à l’ETL spatial et aux échanges de jeux de données. L’application peut ignorer les fichiers sans rapport, contrôler les noms et les tailles, puis transmettre les éléments autorisés au composant métier suivant sans décompresser tout le package.

Comment extraire des fichiers FileGDB d'une archive ZIP avec C#

Installez le package Aspose.ZIP for .NET et référencez le namespace Aspose.Zip. Les métadonnées sont accessibles avant l’extraction : l’application peut donc contrôler ArchiveEntry.Name, ArchiveEntry.IsDirectory et ArchiveEntry.UncompressedSize avant d’écrire un fichier.


Package Manager Console Command

PM> Install-Package Aspose.Zip

Ouvrez le ZIP avec Archive, parcourez Archive.Entries, identifiez la limite du répertoire .gdb/ et restaurez toutes les entrées placées sous ce dossier. Conservez les chemins relatifs validés et vérifiez que chaque destination résolue reste sous la racine de sortie.

Étapes pour extraire des fichiers FileGDB en C#

  • Définissez le chemin du ZIP source et créez un répertoire de sortie isolé.
  • Ouvrez l’archive avec la classe Archive.
  • Parcourez Archive.Entries au lieu d’extraire immédiatement tout le package.
  • Identifiez toutes les entrées situées sous un répertoire dont le nom se termine par .gdb.
  • Construisez un chemin de destination qui reste sous la racine autorisée.
  • Refusez les entrées dépassant la limite de taille décompressée.
  • Enregistrez chaque entrée approuvée avec ArchiveEntry.Extract.

Prérequis système

Avant d’exécuter l’exemple, vérifiez que l’environnement comprend:

  • Une version de .NET prise en charge sous Windows, Linux ou macOS.
  • Visual Studio, JetBrains Rider, Visual Studio Code ou un autre environnement C#.
  • Aspose.ZIP for .NET installé via NuGet ou référencé comme assembly.
  • Un accès en lecture au ZIP source et un accès en écriture au répertoire cible.
  • Des limites définies pour la taille, la durée et le stockage temporaire.

Exemple C# : extraire des fichiers FileGDB sélectionnés depuis un ZIP

Le code ouvre un package ZIP, ignore les répertoires, filtre les entrées correspondant au format et écrit les fichiers retenus dans une destination contrôlée. En production, ajoutez une règle déterministe pour les doublons et plafonnez également la taille totale décompressée.

Extraire des fichiers FileGDB depuis un ZIP - C#

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

string archivePath = Path.GetFullPath("geodata.zip");
string outputDirectory = Path.GetFullPath("extracted-filegdb");
const ulong MaxEntrySize = 100UL * 1024 * 1024;

Directory.CreateDirectory(outputDirectory);

using (var archive = new Archive(archivePath))
{
    foreach (ArchiveEntry entry in archive.Entries)
    {
        string normalizedName = entry.Name.Replace('\\', '/');
        int marker = normalizedName.IndexOf(".gdb/", StringComparison.OrdinalIgnoreCase);
        if (marker < 0) continue;

        string relativePath = normalizedName;
        string destinationPath = Path.GetFullPath(
            Path.Combine(outputDirectory, relativePath.Replace('/', Path.DirectorySeparatorChar)));
        string pathFromRoot = Path.GetRelativePath(outputDirectory, destinationPath);

        if (Path.IsPathRooted(pathFromRoot)
            || pathFromRoot.Equals("..", StringComparison.Ordinal)
            || pathFromRoot.StartsWith(
                ".." + Path.DirectorySeparatorChar,
                StringComparison.Ordinal))
        {
            throw new InvalidDataException("Archive entry resolves outside the output directory.");
        }

        if (entry.IsDirectory)
        {
            Directory.CreateDirectory(destinationPath);
            continue;
        }

        if (entry.UncompressedSize > MaxEntrySize)
        {
            throw new InvalidDataException(
                $"Entry '{entry.Name}' exceeds the 100 MB extraction limit.");
        }

        Directory.CreateDirectory(Path.GetDirectoryName(destinationPath)!);
        entry.Extract(destinationPath);
    }
}

Notes de production pour les fichiers FileGDB

FileGDB est un jeu de données composé d’un répertoire .gdb et de plusieurs fichiers interdépendants. Conservez toute l’arborescence validée : aplatir les chemins ou n’extraire qu’un membre peut rendre la géodatabase inutilisable.

Le filtrage par extension identifie un fichier candidat, mais ne valide ni sa structure interne ni son intégrité. Avant de l’importer, l’afficher ou le convertir, contrôlez-le avec un composant SIG. Définissez aussi une règle explicite pour les noms en double et limitez la taille totale après extraction.

Sécurité et confidentialité

Traitez le ZIP importé, les noms d’entrées et leur contenu comme des données non fiables. N’ajoutez pas directement ArchiveEntry.Name au répertoire de sortie : une entrée peut contenir un chemin absolu ou des segments remontant vers un dossier parent. Si vous conservez l’arborescence, résolvez le chemin final et vérifiez qu’il reste sous la racine autorisée.

Limitez la taille compressée, la taille après extraction, le nombre d’entrées, la durée d’exécution et la concurrence. Utilisez un stockage temporaire aux droits restreints, nettoyez les résultats après une erreur et n’inscrivez dans les logs ni mots de passe, ni noms privés, ni contenu extrait.

FAQ sur l'extraction de fichiers FileGDB

Comment extraire uniquement les fichiers FileGDB d’une archive ZIP en C# ?

Repérez le dossier .gdb, conservez sa structure relative validée et extrayez chaque fichier requis vers une destination qui reste sous la racine autorisée.

Aspose.ZIP analyse-t-il le contenu du fichier FileGDB ?

Non. Aspose.ZIP restaure le fichier stocké dans l'archive. La lecture, la validation ou la conversion de son contenu relève du composant spécialisé pour ce format.

Le même principe fonctionne-t-il avec des archives 7Z, RAR ou TAR ?

Oui, mais chaque conteneur doit être ouvert avec la classe Aspose.ZIP correspondante. Les types d'entrées et les opérations disponibles peuvent varier selon le format.

Comment gérer plusieurs fichiers FileGDB portant le même nom ?

Définissez la règle avant l'extraction : refuser le doublon, générer un nom unique ou conserver une arborescence relative après validation de chaque chemin.