在Powershell中,如何拆分大型二进制文件?

在Powershell中,如何拆分大型二进制文件?,powershell,Powershell,我在其他地方看到了文本文件的答案,但我需要对压缩文件这样做 我有一个6G二进制文件,需要分为100M个块。我是否错过了unix“头”的模拟功能?没关系。给你: function split($inFile, $outPrefix, [Int32] $bufSize){ $stream = [System.IO.File]::OpenRead($inFile) $chunkNum = 1 $barr = New-Object byte[] $bufSize while( $b

我在其他地方看到了文本文件的答案,但我需要对压缩文件这样做


我有一个6G二进制文件,需要分为100M个块。我是否错过了unix“头”的模拟功能?

没关系。给你:

function split($inFile,  $outPrefix, [Int32] $bufSize){

  $stream = [System.IO.File]::OpenRead($inFile)
  $chunkNum = 1
  $barr = New-Object byte[] $bufSize

  while( $bytesRead = $stream.Read($barr,0,$bufsize)){
    $outFile = "$outPrefix$chunkNum"
    $ostream = [System.IO.File]::OpenWrite($outFile)
    $ostream.Write($barr,0,$bytesRead);
    $ostream.close();
    echo "wrote $outFile"
    $chunkNum += 1
  }
}

假设:bufSize适合内存。

我回答了Berndk在这个问题的评论中提到的问题,但在这种情况下,我会使用-
ReadCount
,而不是
-TotalCount
,例如

Get-Content bigfile.bin -ReadCount 100MB -Encoding byte

这会导致
Get Content
在块大小为文本编码行或字节对字节编码时读取文件块。请记住,当它执行此操作时,您将获得一个数组,该数组沿着管道传递,而不是单个字节或文本行。

这个推论问题的答案是:如何将它们重新组合在一起

function stitch($infilePrefix, $outFile) {

    $ostream = [System.Io.File]::OpenWrite($outFile)
    $chunkNum = 1
    $infileName = "$infilePrefix$chunkNum"

    $offset = 0

    while(Test-Path $infileName) {
        $bytes = [System.IO.File]::ReadAllBytes($infileName)
        $ostream.Write($bytes, 0, $bytes.Count)
        Write-Host "read $infileName"
        $chunkNum += 1
        $infileName = "$infilePrefix$chunkNum"
    }

    $ostream.close();
}

这看起来很有趣:这也是…对的,然后你需要找出一种方法将每个块放入不同的文件中。上面的Jason Fossen链接建议不要使用get-content操作大型数据集:“对于大型文件,get-content的性能非常糟糕。除非您读取的数据小于200KB,否则不要使用get-content…”这是您的体验吗?另外,你能把它表达成一个类似于我上面提到的完整解决方案吗?有机会在一个大文件上尝试一下,是的,除非你有一个64位PowerShell,否则别想它了。:-)我在1KB的读取计数方面运气不错,但让Get内容将其打包成100MB的块并不能扩展。太糟糕了,PowerShell无法更直接地处理此问题。为什么我们需要
$stream.seek
?Read方法会自动设置当前位置,对吗?你可能是对的,@Samik。如果您可以测试它以确保它工作,我将删除这行代码。是的,我注释掉了涉及$curOffset的三行代码,它也工作得很好。当我使用这个脚本分割文本文件时,我必须添加几行代码,这样它不会在中间行。无论如何,谢谢你的代码。