2016-10-06 3 views
0

Ich verwende Azure File Storage, um einige Dateien zu speichern, und ich möchte eine Zip-Datei erstellen, die einige dieser Dateien in derselben Azure-Dateifreigabe enthält.Wie kann ich die Größe eines Azure File Storage CloudFile erhöhen, bevor ich die Dateigröße kenne?

Dies ist mein Code so weit:

private void CreateZip(CloudFileDirectory directory) { 

    if (directory == null) throw new ArgumentNullException(nameof(directory)); 

    var zipFilename = $"{directory.Name}.zip"; 

    var zip = directory.GetFileReference(zipFilename); 
    if (!zip.Exists()) { 

     zip.Create(0); // <-- I don't know what size its gonna be!! 

     using (var zipStream = zip.OpenWrite(null)) 
     using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create)) { 

      foreach (var file in directory.ListFilesAndDirectories().OfType<CloudFile>()) { 
       if (file.Name.Equals(zipFilename, StringComparison.InvariantCultureIgnoreCase)) 
        continue;       

       using (var fileStream = file.OpenRead()) { 

        var entry = archive.CreateEntry(file.Name); 
        using (var entryStream = entry.Open()) 
         fileStream.CopyTo(entryStream); // <-- exception is thrown 
       } 
      } 
     } 
    } 
} 

Auf der Linie zip.Create(0); dies eine leere Datei erstellt. Ich gehe auf diese Datei dann Referenz verwenden, um eine Zip-Datei zu erstellen, und fügen Sie Sachen, aber wenn es um die fileStream.CopyTo(entryStream); bekommt wirft es eine Ausnahme mit dieser Nachricht:

The remote server returned an error: (416) The range specified is invalid for the current size of the resource. 

Vermutlich weil die Dateigröße ist 0 und es ist nicht möglich, die Größe automatisch zu erhöhen.

Ich kann die Datei mit int.MaxValue erstellen, aber dann bekomme ich eine 2GB-Datei. Ich kann nicht einmal die Größe der Datei berechnen, die ich dem Archiv hinzufüge, und die Größe der Datei anpassen, um sie um diesen Betrag zu erweitern, weil sie eine Zip-Datei ist und komprimiert und die Dateigröße ändert.

Wie mache ich das?

Antwort

1

Dieses Problem hängt mehr mit System.IO.Compression zusammen. Ich habe Ihren Code neu geschrieben, bitte verwenden Sie stattdessen den memory stream wie den folgenden Code. Es funktioniert gut auf meiner Seite. Hoffe es könnte dir ein paar Tipps geben.

 public static void CreateZip(CloudFileDirectory directory) 
     { 

      if (directory == null) throw new ArgumentNullException(nameof(directory)); 

      var zipFilename = $"{directory.Name}.zip";   
      var zip = directory.GetFileReference(zipFilename); 
      if (!zip.Exists()) 
      { 

       //zip.Create(600000); // <-- I don't know what size its gonna be!! 

       using (var memoryStream = new MemoryStream()) 
       { 
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
        { 

         foreach (var file in directory.ListFilesAndDirectories().OfType<CloudFile>()) 
         { 
          if (file.Name.Equals(zipFilename, StringComparison.InvariantCultureIgnoreCase)) 
           continue; 

          using (var fileStream = file.OpenRead()) 
          { 

           var entry = archive.CreateEntry(file.Name, CompressionLevel.Optimal); 
           using (var entryStream = entry.Open()) 
           { 

            fileStream.CopyTo(entryStream); // <-- exception is thrown 
           } 

          } 
         } 
        } 
        memoryStream.Seek(0, SeekOrigin.Begin); 
        zip.UploadFromStream(memoryStream); 

       } 

      } 
     } 
+0

ich tatsächlich versucht, einen Speicherstrom verwendet wird, konnte es aber nicht die Arbeit zu, und in Ihrem Code suchen Ich glaube, es war, weil ich die Postition des Stroms wieder auf 0 zurückgesetzt vergessen ... danke für Ihre Hilfe! – BG100

Verwandte Themen