使用 Powershell 对大型 Zip 文件进行 Base64 编码
Base64 Encode Large Zip File Using Powershell
我正在尝试将一个 ~66MB 的 zip 文件进行 base64 编码为一个字符串,然后使用 Powershell 将其写入一个文件。我正在处理一个限制,最终我 必须 将 base64 编码的文件字符串直接包含到 Powershell 脚本中,这样当脚本 运行 在不同的位置时,可以从中重新创建 zip 文件。我并不局限于使用 Powershell 创建 base64 编码的字符串。这正是我最熟悉的。
我目前使用的代码:
$file = 'C:\zipfile.zip'
$filebytes = Get-Content $file -Encoding byte
$fileBytesBase64 = [System.Convert]::ToBase64String($filebytes)
$fileBytesBase64 | Out-File 'C:\base64encodedString.txt'
以前,我处理的文件足够小,编码速度相对较快。但是,我现在发现我正在编码的文件会导致进程耗尽我所有的 RAM,最终变得非常慢。我觉得有更好的方法可以做到这一点,如果有任何建议,我将不胜感激。
在我看来,编码或解码 117-Mb 文件只需要不到 1 秒的时间。
Src file size: 117.22 MiB
Tgt file size: 156.3 MiB
Decoded size: 117.22 MiB
Encoding time: 0.294
Decoding time: 0.708
代码I制定措施:
$pathSrc = 'D:\blend5\scena31.blend'
$pathTgt = 'D:\blend5\scena31.blend.b64'
$encoding = [System.Text.Encoding]::ASCII
$bytes = [System.IO.File]::ReadAllBytes($pathSrc)
Write-Host "Src file size: $([Math]::Round($bytes.Count / 1Mb,2)) MiB"
$swEncode = [System.Diagnostics.Stopwatch]::StartNew()
$B64String = [System.Convert]::ToBase64String($bytes, [System.Base64FormattingOptions]::None)
$swEncode.Stop()
[System.IO.File]::WriteAllText($pathTgt, $B64String, $encoding)
$B64String = [System.IO.File]::ReadAllText($pathTgt, $encoding)
Write-Host "Tgt file size: $([Math]::Round($B64String.Length / 1Mb,2)) MiB"
$swDecode = [System.Diagnostics.Stopwatch]::StartNew()
$bytes = [System.Convert]::FromBase64String($B64String)
$swDecode.Stop()
Write-Host "Decoded size: $([Math]::Round($bytes.Count / 1Mb,2)) MiB"
Write-Host "Encoding time: $([Math]::Round($swEncode.Elapsed.TotalSeconds,3)) s"
Write-Host "Decoding time: $([Math]::Round($swDecode.Elapsed.TotalSeconds,3)) s"
我正在尝试将一个 ~66MB 的 zip 文件进行 base64 编码为一个字符串,然后使用 Powershell 将其写入一个文件。我正在处理一个限制,最终我 必须 将 base64 编码的文件字符串直接包含到 Powershell 脚本中,这样当脚本 运行 在不同的位置时,可以从中重新创建 zip 文件。我并不局限于使用 Powershell 创建 base64 编码的字符串。这正是我最熟悉的。
我目前使用的代码:
$file = 'C:\zipfile.zip'
$filebytes = Get-Content $file -Encoding byte
$fileBytesBase64 = [System.Convert]::ToBase64String($filebytes)
$fileBytesBase64 | Out-File 'C:\base64encodedString.txt'
以前,我处理的文件足够小,编码速度相对较快。但是,我现在发现我正在编码的文件会导致进程耗尽我所有的 RAM,最终变得非常慢。我觉得有更好的方法可以做到这一点,如果有任何建议,我将不胜感激。
在我看来,编码或解码 117-Mb 文件只需要不到 1 秒的时间。
Src file size: 117.22 MiB
Tgt file size: 156.3 MiB
Decoded size: 117.22 MiB
Encoding time: 0.294
Decoding time: 0.708
代码I制定措施:
$pathSrc = 'D:\blend5\scena31.blend'
$pathTgt = 'D:\blend5\scena31.blend.b64'
$encoding = [System.Text.Encoding]::ASCII
$bytes = [System.IO.File]::ReadAllBytes($pathSrc)
Write-Host "Src file size: $([Math]::Round($bytes.Count / 1Mb,2)) MiB"
$swEncode = [System.Diagnostics.Stopwatch]::StartNew()
$B64String = [System.Convert]::ToBase64String($bytes, [System.Base64FormattingOptions]::None)
$swEncode.Stop()
[System.IO.File]::WriteAllText($pathTgt, $B64String, $encoding)
$B64String = [System.IO.File]::ReadAllText($pathTgt, $encoding)
Write-Host "Tgt file size: $([Math]::Round($B64String.Length / 1Mb,2)) MiB"
$swDecode = [System.Diagnostics.Stopwatch]::StartNew()
$bytes = [System.Convert]::FromBase64String($B64String)
$swDecode.Stop()
Write-Host "Decoded size: $([Math]::Round($bytes.Count / 1Mb,2)) MiB"
Write-Host "Encoding time: $([Math]::Round($swEncode.Elapsed.TotalSeconds,3)) s"
Write-Host "Decoding time: $([Math]::Round($swDecode.Elapsed.TotalSeconds,3)) s"