none
Compress-Archive - Der Datenstrom war zu lang. RRS feed

  • Frage

  • Hallo Leute

    Ich versuche Hyper-V Snapshots in ZIP Files zu packen, leider scheinen die Datenmengen (bis zu einige TB) zu groß zu sein:

    Compress-Archive -Path $SnapshotPath -CompressionLevel Optimal -DestinationPath $TargetFile
    Ausnahme beim Aufrufen von "Write" mit 3 Argument(en):  "Der Datenstrom war zu lang."
    In C:\windows\system32\windowspowershell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:805
    Zeichen:29
    + ...                     $destStream.Write($buffer, 0, $numberOfBytesRead)
    +                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : IOException

    Im Endeffekt geht es mit nur darum einen Ordner mit sämlichen Unterordnern und Dateien in eine Datei zu kriegen.

    Auf die Kompression kann ich eigentlich sogar verzichten, da ein Snapshot schon möglichst klein sein sollte.

    Hat jemand eine Idee eventuell mit ein paar Zeilen Code wie man die Daten rein packt und wieder raus kriegt?

    Danke

    MfG
    Thomas

    Sonntag, 17. Januar 2016 21:41

Antworten

  • Compress-Archive bzw. die darunterliegende .Net-Api "System.IO.Compression.ziparchive" hat in der Tat eine Beschränkung auf 2GB.
    Allerdings gibt es eine weitere passende Klasse die du alternativ verwenden kannst und die zumindest nach meinen Tests (mit einem 15GB-File) diese Beschränkung nicht hat:  System.IO.Compression.Zipfile
    Ob das auch in Terrabyte-Regionen klappt musst du ausprobieren.
     
    Ein Anwendungsbeispiel um den Ordner "Myfiles" ( hier ohne Kompression) in die Datei "MyZip" zu verwandeln wäre: 
     

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.IO.compression.filesystem")
    [System.IO.Compression.ZipFile]::CreateFromDirectory("D:\myfiles", "D:\myzip.zip","NoCompression",$true)
     
    Statt "NoCompression" geht genau wie bei dem Powershell-Befehl auch noch "fastest" und "optimal". Der letzte Parameter ($true oder $false) bestimmt ob der Ordner selbst auch mit ins Archiv soll oder nur die Dateien. Siehe auch hier: LINK
     

    Als kleiner Bonus ist die direkte Verwendung der Net-Api auch noch etwas flotter als das Cmdlet, wobei du bei Terrabytes sicherlich trotzdem mit erheblichen Laufzeiten rechnen musst.
    Und auspacken geht so:    
     

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.IO.compression.filesystem")
    [System.IO.Compression.ZipFile]::ExtractToDirectory("D:\myzip.zip","D:\myfiles")
    (die Assembly musst du natürlich nur einmal pro Script laden.)

     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Sonntag, 17. Januar 2016 23:46
    Moderator

Alle Antworten

  • Compress-Archive bzw. die darunterliegende .Net-Api "System.IO.Compression.ziparchive" hat in der Tat eine Beschränkung auf 2GB.
    Allerdings gibt es eine weitere passende Klasse die du alternativ verwenden kannst und die zumindest nach meinen Tests (mit einem 15GB-File) diese Beschränkung nicht hat:  System.IO.Compression.Zipfile
    Ob das auch in Terrabyte-Regionen klappt musst du ausprobieren.
     
    Ein Anwendungsbeispiel um den Ordner "Myfiles" ( hier ohne Kompression) in die Datei "MyZip" zu verwandeln wäre: 
     

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.IO.compression.filesystem")
    [System.IO.Compression.ZipFile]::CreateFromDirectory("D:\myfiles", "D:\myzip.zip","NoCompression",$true)
     
    Statt "NoCompression" geht genau wie bei dem Powershell-Befehl auch noch "fastest" und "optimal". Der letzte Parameter ($true oder $false) bestimmt ob der Ordner selbst auch mit ins Archiv soll oder nur die Dateien. Siehe auch hier: LINK
     

    Als kleiner Bonus ist die direkte Verwendung der Net-Api auch noch etwas flotter als das Cmdlet, wobei du bei Terrabytes sicherlich trotzdem mit erheblichen Laufzeiten rechnen musst.
    Und auspacken geht so:    
     

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.IO.compression.filesystem")
    [System.IO.Compression.ZipFile]::ExtractToDirectory("D:\myzip.zip","D:\myfiles")
    (die Assembly musst du natürlich nur einmal pro Script laden.)

     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Sonntag, 17. Januar 2016 23:46
    Moderator
  • Danke!

    Funktioniert zumindest schon mal mit ca 20GB.


    mfG Thomas


    Montag, 18. Januar 2016 04:46