2008-12-04 8 views
2

Je crée un fichier zip en utilisant la FastZip de classe de SharpZipLib et une fois que je après avoir fermer le programme, je ne peux pas supprimer le fichier parce que:Impossible de supprimer le fichier Zip créé par SharpZipLib (FastZip)

« Impossible de supprimer zip .zip: Utilisé par une autre personne ou un autre programme, fermez tous les programmes susceptibles d'utiliser le fichier et réessayez. "

Le code qui génère le fichier est tout simplement ceci:

fZip.CreateEmptyDirectories = true; 
fZip.CreateZip(filesPath + "\\" + this.zipName, filesPath, false, this.zipFilter); 

J'ai essayé d'utiliser:

  using (FastZip fZip = new FastZip()) 
      { 
       try 
       { 
        fZip.CreateEmptyDirectories = true; 
        fZip.CreateZip(filesPath + "\\" + this.zipName, filesPath, false, this.zipFilter); 
       } 
       catch (Exception) 
       { 
       } 
      } 

Mais il ne convertit pas IDisposable

Répondre

1

Peut-être antivirus est occupé vérification le fichier? Sinon, obtenez un programme qui peut vous dire quels programmes ont des fichiers ouverts.

Vous pouvez consulter:

+0

Non, éteint l'antivirus et il ne veut toujours pas que je le supprime. Le déverrouilleur n'a pas aidé aussi. – LuRsT

+0

SysInternals Process Explorer devrait également être en mesure de vous dire à qui appartient le fichier. http://www.sysinternals.com – GalacticCowboy

+0

Unlocker l'a fait. Je n'ai pas vu la boîte de sélection de suppression au début. – LuRsT

0

Je ne suis pas familier avec l'API FastZip (donc c'est juste un botté de dégagement), mais avez-vous besoin pour fermer la archive avec quelque chose comme fZip.Close();

J'aurais pensé que la fermeture du programme aurait fait la même chose mais juste une supposition.

+0

Je pense à cela aussi, mais la classe fastZip ne l'a pas :( – LuRsT

+0

Est-ce que FastZip implémente IDisposable? Si oui, avez-vous utilisé "using" ou ".Dispose();"? – GalacticCowboy

0

Assurez-vous que vous fermez le flux SharpZipLib une fois que vous avez terminé, vous pouvez le faire en enveloppant la construction de celui-ci dans une instruction « en utilisant » ...

+0

Mais, je n'utilise pas un ShrapZipLibStream.J'utilise fastzip – LuRsT

3

Il ressemble ce peut être un bug avec SharpZipLib. La méthode FastZip.CreateZip a trois et deux surcharges les créer utilisation File.Create tels que:

CreateZip(File.Create(zipFileName), // ... 

Il semble qu'il ne ferme pas le flux, vous pouvez être mieux en utilisant:

string zipFileName = System.IO.Path.Combine(filesPath, this.zipName); 
using (Stream stream = File.Create(zipFileName)) 
{ 
    fZip.CreateZip(stream, filesPath, false, this.zipFilter, null); 
    stream.Close(); 
} 

Techniquement, vous ne devriez pas avoir besoin d'appeler Close dans le bloc using, mais j'aime être explicite à ce sujet.

+0

J'ai utilisé le code, mais il donne la même erreur ... Je commence à penser que le problème est le pc ... – LuRsT

3

Je viens de résoudre ce problème moi-même. Il s'avère que ce n'était pas SharpZipLib/FastZip. J'envoyais un e-mail via System.Net.Mail et j'avais attaché le fichier FastZipped en tant que pièce jointe à cet e-mail. Lorsque j'ai essayé de supprimer le fichier joint, j'ai rencontré l'erreur que vous avez reçue. Il s'avère que tout ce que j'avais à faire était d'appeler MailMessage.Dispose() après avoir envoyé l'email. Jetez un oeil à tous les autres éléments de votre code qui pourraient contenir un verrou sur le fichier; essayez d'éliminer() ou de fermer() ces objets si possible.

Questions connexes