2016-03-07 95 views
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前两个字节似乎总是等于255254,这会导致PowerShell的XML解析器抛出一个例外。
作为临时的解决方法,我尝试省略前两个字节,但这只是最后两个字节发生同样的问题。

这将我引向我的问题,缓冲区如何被混淆?
我的做法错误吗?我错过了什么?

任何帮助,高度赞赏!

UPDATE:

好,似乎Windows使用UTF-16作为内部编码,这将意味着前两个字节是Byte Order Mark (BOM)。我期望GetString()方法识别BOM,有人可以澄清这一点?

回答

0

你要包装你的流为StreamReader,然后使用ReadToEnd()方法,我期望尊重BOM:

$reader = new-object System.IO.StreamReader($entr.Open()) 
$contents = $reader.ReadToEnd() 
$reader.Close() 
+0

这确实奏效了! “System.Text.UnicodeEncoding”类是否有任何理由不尊重BOM? –

+0

我必须检查框架资源。我怀疑它与你通过使用指定的Encoding类告诉系统缓冲区是某种类型的事实有关。如果使用'StreamReader',你可以让框架在构造字符串缓冲区时检测正确的编码。 – jessehouwing