1
我目前正在嘗試讀取.zip壓縮文件中特定.xml文件的內容而不提取它。
代碼很簡單,但不知怎的,有幾個字節滑入緩衝區,使得不可能使用文件的內容。Powershell - 從.zip壓縮文件中讀取文件失敗
這是各自的代碼:
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")
$arch = [System.IO.Compression.ZipFile]::OpenRead("C:\file.zip")
$entr = $arch.Entries | ?{$_.Name -like "test.xml"}
if(!$entr)
{throw [System.Exception] "Could not find the .xml file"}
$buf = New-Object System.Byte[]($entr.Length)
$entr.Open().Read($buf, 0, $entr.Length) | Out-Null
$xml = [xml] ([System.Text.Encoding]::Unicode.GetString($buf))
的代碼是非常簡單的我會說,但可悲的$buf
前兩個字節似乎總是等於255
和254
,這會導致PowerShell的XML解析器拋出一個例外。
作爲臨時的解決方法,我嘗試省略前兩個字節,但這只是最後兩個字節發生同樣的問題。
這將我引向我的問題,緩衝區如何被混淆?
我的做法錯誤嗎?我錯過了什麼?
任何幫助,高度讚賞!
UPDATE:
好,似乎Windows使用UTF-16作爲內部編碼,這將意味着前兩個字節是Byte Order Mark (BOM)
。我期望GetString()
方法識別BOM
,有人可以澄清這一點?
這確實奏效了! 「System.Text.UnicodeEncoding」類是否有任何理由不尊重BOM? –
我必須檢查框架資源。我懷疑它與你通過使用指定的Encoding類告訴系統緩衝區是某種類型的事實有關。如果使用'StreamReader',你可以讓框架在構造字符串緩衝區時檢測正確的編碼。 – jessehouwing