在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的三行代码,它也工作得很好。当我使用这个脚本分割文本文件时,我必须添加几行代码,这样它不会在中间行。无论如何,谢谢你的代码。