web-dev-qa-db-fra.com

La fin de l'enregistrement du répertoire central est introuvable

Je télécharge un fichier Zip à l'aide du programme c # et j'obtiens l'erreur

at System.IO.Compression.ZipArchive.ReadEndOfCentralDirectory()
   at System.IO.Compression.ZipArchive.Init(Stream stream, ZipArchiveMode mode,
Boolean leaveOpen)
   at System.IO.Compression.ZipArchive..ctor(Stream stream, ZipArchiveMode mode,
 Boolean leaveOpen, Encoding entryNameEncoding)
   at System.IO.Compression.ZipFile.Open(String archiveFileName, ZipArchiveMode
mode, Encoding entryNameEncoding)
   at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileN
ame, String destinationDirectoryName, Encoding entryNameEncoding)
   at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileN
ame, String destinationDirectoryName)

Voici le programme

    response = (HttpWebResponse)request.GetResponse();
    Stream ReceiveStream = response.GetResponseStream();
    byte[] buffer = new byte[1024];
    FileStream outFile = new FileStream(zipFilePath, FileMode.Create);
    int bytesRead;
    while ((bytesRead = ReceiveStream.Read(buffer, 0, buffer.Length)) != 0)
        outFile.Write(buffer, 0, bytesRead);
    outFile.Close();
    response.Close();
    try
    {
        ZipFile.ExtractToDirectory(zipFilePath, destnDirectoryName);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
        Console.ReadLine();
    }

Je ne comprends pas l'erreur. Quelqu'un peut-il expliquer cela Merci MR

33
user2726975

Le problème est que Unzip ne peut pas trouver la ligne de code qui signale la fin de l'archive, donc soit:

  1. L'archive est corrompue.

    • Solution - L'archive devra être réparée.
  2. Ce n'est pas une archive .Zip.

    • Il peut s'agir d'un fichier .rar ou d'un autre type compressé. Ou comme je le soupçonne ici, vous téléchargez un fichier html qui se redirige automatiquement vers le fichier Zip.
    • Solution - Je dois trouver une archive correcte pour utiliser ce code.
  3. Il y a plus d'une partie dans l'archive.
    • Un fichier Zip en plusieurs parties.
    • Solution - Lisez tous les fichiers avant la décompression.
  4. Comme @ElliotSchmelliot le note dans les commentaires, le fichier peut être masqué ou avoir des caractères étendus dans le nom.
    • Solution - Vérifiez vos attributs/autorisations de fichier et vérifiez le nom de fichier.

L'ouverture du fichier avec votre utilitaire Zip préféré vous dira lequel il pourrait s'agir.

27
paqogomez

De votre ancienne question que vous avez supprimée.

J'obtiens System.IO.InvalidDataException: la fin de l'enregistrement du répertoire central est introuvable.

Cela signifie très probablement que le fichier que vous transmettez est mal formé et que le Zip échoue. Puisque vous avez déjà le fichier outfile sur le disque dur, je recommanderais d'essayer d'ouvrir ce fichier avec des fenêtres intégrées dans Zip extractor et de voir si cela fonctionne. S'il échoue, le problème ne vient pas de votre code de décompression mais des données que le serveur vous envoie.

14
Scott Chamberlain

J'ai le même problème, mais dans mon cas, le problème concerne la partie compression et non la décompression.

Pendant la compression, j'ai également besoin d'utiliser le statament "Utilisation" avec le Stream et les objets ZipArchive. Le statament "Utilisation" fermera correctement l'archive et je pourrai la décompresser sans aucun problème.

Le code de travail dans mon cas dans VB.Net:

Using zipSteramToCreate As New MemoryStream()
    Using archive As New ZipArchive(zipSteramToCreate, ZipArchiveMode.Create)
        ' Add entry...
    End Using

    ' Return the Zip byte array for example:
    Return zipSteramToCreate.ToArray
End Using
6
SZL

J'ai rencontré ce même problème. Il existe de nombreux types de compression, .Zip n'étant qu'un des types. Regardez et assurez-vous que vous n'essayez pas de "décompresser" un fichier .rar ou similaire.

3
Roger Hill

Je viens de rencontrer ce fil lorsque j'ai eu la même erreur à partir d'un script PowerShell appelant la méthode Net.WebClient DownloadFile.

Dans mon cas, le problème était que le serveur Web n'a pas pu fournir le fichier Zip demandé et a plutôt fourni une page HTML contenant un message d'erreur, qui ne pouvait évidemment pas être décompressé.

Au lieu de cela, j'ai créé un gestionnaire d'exceptions pour extraire et présenter le "vrai" message d'erreur.

1
paulf

Pourrait être utile à quelqu'un d'autre. J'ai traité cela en ajoutant une exception à mon code, qui ensuite:

  1. Crée un répertoire temporaire
  2. Extrait l'archive Zip (fonctionne normalement)
  3. Renomme l'archive zip d'origine en * .bak
  4. Zippe et remplace le fichier d'archive d'origine par un qui fonctionne
0
user3899886

J'ai utilisé la bibliothèque SharpCompress C # .net disponible via le gestionnaire de paquets Nuget, cela a résolu mon objectif de décompresser.

0
Raghu