2017-10-03 6 views
0

J'ai un projet .Net-Core qui a bien fonctionné sur 1.1 mais échoue maintenant sur 2.0. Le problème se produit lorsque je tente de décompresser une archive zip avec ZipFile.ExtractToDirectory (à partir de System.IO.Compression). Je reçois un ou deux fichiers sur, mais il génère une exception avec le message:ZipFile.ExtractToDirectory échouant sur .Net-Core 2.0

The process cannot access the file '<path to file>' because it is being used by another process. 

Pour autant que je peux dire qu'il n'y a pas d'autre processus qui pourrait être utilise ce fichier tel qu'il vient d'être extrait. Il est réellement présent sur le disque quand j'obtiens l'erreur.

La trace de la pile est:

at System.IO.Win32FileSystem.OpenHandle(String fullPath, Boolean asDirectory) 
at System.IO.Win32FileSystem.SetLastWriteTimeInternal(String fullPath, DateTimeOffset time, Boolean asDirectory) 
at System.IO.Win32FileSystem.SetLastWriteTime(String fullPath, DateTimeOffset time, Boolean asDirectory) 
at System.IO.File.SetLastWriteTime(String path, DateTime lastWriteTime) 
at System.IO.Compression.ZipFileExtensions.ExtractToFile(ZipArchiveEntry source, String destinationFileName, Boolean overwrite) 
at System.IO.Compression.ZipFileExtensions.ExtractToDirectory(ZipArchive source, String destinationDirectoryName, Boolean overwrite) 
at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName, Encoding entryNameEncoding, Boolean overwrite) 
at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName) 
at FunctionDataStore.PackageManagement.InstallPackage(String pkgFile, String pkgDir) in D:\Projects\Momo\UserPlatform\FunctionDataStore\PackageManagement.cs:line 250 

je peux revenir à 1.1 pour le moment mais je dois passer à 2.0.

Est-ce que quelqu'un sait ce qui pourrait causer cette exception et ce que je peux faire à ce sujet?

Ajouté: 27 17 novembre

Je pensais avoir la réponse après un redémarrage. Mais maintenant le problème persiste, peu importe combien de fois je redémarre le système. Il y a un problème avec .NET Core 2.0 et System.IO.Compression.ZipFile. J'ai vérifié qu'aucun autre processus n'utilise réellement les fichiers extraits quand l'erreur se produit.

Addendum: 207 nov 17

Puisque la trace de la pile montre ExtractToDirectory échoue sur l'appel SetLastWriteTime, et je ne suis pas vraiment sur les horodateurs sur les fichiers, j'ai remplacé l'appel ExtractToDirectory à ce qui suit :

using (ZipArchive archive = ZipFile.Open(pkgFile, ZipArchiveMode.Read)) 
{ 
    foreach (var entry in archive.Entries) 
    { 
     var filename = pkgDir + "\\" + entry.FullName; 
     var fileDir = Path.GetDirectoryName(filename); 
     Directory.CreateDirectory(fileDir); 
     using (BinaryWriter writer = new BinaryWriter(File.Open(filename, FileMode.Create))) 
     { 
      byte[] bytes = new byte[1024]; 
      int numbytes; 
      var stream = entry.Open(); 
      while ((numbytes = stream.Read(bytes, 0, 1024)) > 0) 
      { 
       writer.Write(bytes, 0, numbytes); 
      } 
     } 
    } 
} 

pkgFile est le fichier zip à lire et pkgDir est le répertoire pour extraire à. Cela semble fonctionner sans problème.

Je ne sais toujours pas pourquoi le SetLastWriteTime échoue en ExtractToDirectory, cependant. Mais cette solution de contournement semble être suffisante pour mes besoins.

+0

Hmm, non, c'est un problème environnemental. Premier lieu à toujours démarrer: désactivez le produit anti-programme malveillant installé et réessayez. –

+0

@HansPassant, si tel était le cas alors pourquoi cela fonctionnerait-il dans .Net Core 1.1? – melston

+0

La corrélation n'implique pas de causalité. Le plus évident en réalisant que la version .NETCore ne change pas en redémarrant votre machine. –

Répondre

0

Vous pouvez trouver quel processus utilise votre fichier pour trouver la racine de l'erreur. pour trouver quel processus utilise le fichier télécharger process explorer

  1. explorateur de processus d'exécution
  2. appuyez sur ctrl + f
  3. nom du type de votre fichier
  4. cette façon, vous pouvez trouver et tuer processus en utilisant votre fichier