2017-01-26 5 views
0

Я пытаюсь запрограммировать скрипт, который получает zip-файл из Интернета и извлекает из него один файл с помощью потоков.Декомпрессированный файл слишком большой

Проблема в том, что извлеченный файл слишком большой.

  • Сжатый Размер: 30 кб
  • Оригинал Размер: 373 кб
  • расжатая Размер: 825kb

Я был бы рад, если кто-то может помочь мне найти то, что случилось с моим кодом. Я очень хочу получить ответ, используя потоки.

файл, который загружается (на сегодняшний день) является: https://bitbucket.org/rude/love/downloads/love-0.10.2-win64.zip

Мой код:

### Download current LOVE framework executable ### 

# By default PowerShell supports only SSL3 and TLS1.0, add TLS1.1 and TLS1.2 support. 
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12' 

# Get current version of the LOVE framework 

$request = Invoke-WebRequest "https://love2d.org/" 
$downloadUri = (Select-String -InputObject $request.Content -Pattern "https://bitbucket\.org/rude/love/downloads/love-.*-win64\.zip").Matches[0].Value 
$loveBinaryStream = (Invoke-WebRequest $downloadUri).RawContentStream 

# Extract love.exe 
Add-Type -AssemblyName System.IO.Compression 
$zipArchive = New-Object System.IO.Compression.ZipArchive($loveBinaryStream) 
$zipEntry = $zipArchive.Entries | ? { $_.Name -eq "love.exe" } 

$stream = $zipEntry.Open() 
$sr = New-Object System.IO.StreamReader($stream) 
$sw = New-Object System.IO.StreamWriter("love.exe") 
$sw.Write($sr.ReadToEnd()) 
$sw.Close() 
$sr.Close() 
$stream.Close() 
+1

Вы просматривали содержимое выходного файла? Я бы попробовал использовать Format-Hex, чтобы узнать, что находится на выходе. –

ответ

0

Я считаю, что это был какой-то вопрос кодирования.

В любом случае, подставляя:

$stream = $zipEntry.Open() 
$sr = New-Object System.IO.StreamReader($stream) 
$sw = New-Object System.IO.StreamWriter("love.exe") 
$sw.Write($sr.ReadToEnd()) 
$sw.Close() 
$sr.Close() 
$stream.Close() 

для этого

# Save to disk 
$sw = [System.IO.FileStream]::new($tempLovePath, [System.IO.FileMode]::Create) 
$stream = $zipEntry.Open() 
$stream.CopyTo($sw) 
$stream.Close() 
$sw.Close() 

решаемые проблемы.

1
### Download current LOVE framework executable ### 

# By default PowerShell supports only SSL3 and TLS1.0, add TLS1.1 and TLS1.2 support. 
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12' 

# Get current version of the LOVE framework 

$request = Invoke-WebRequest "https://love2d.org/" 
$downloadUri = (Select-String -InputObject $request.Content -Pattern "https://bitbucket\.org/rude/love/downloads/love-.*-win64\.zip").Matches[0].Value 
$loveBinaryStream = (Invoke-WebRequest $downloadUri).RawContentStream 

# Extract love.exe 
Add-Type -AssemblyName System.IO.Compression 
Add-Type -AssemblyName system.io.compression.filesystem # for the System.IO.Compression.ZipFileExtensions 
$zipArchive = New-Object System.IO.Compression.ZipArchive($loveBinaryStream) 
$zipEntry = $zipArchive.Entries | ? { $_.Name -eq "love.exe" } 
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($zipEntry, "path_to_file") 
+0

Спасибо, хороший совет. Тем не менее, я бы хотел использовать потоки. Мне жаль, что я не упоминал об этом. У тебя тоже есть идея? – Daniel

Смежные вопросы